pku Left labyrinths DFS网格图搜索-注意这种非优先路搜索判重一定要带方向向量

题目意思很简单,一个迷宫,问是否能够从入口处进入,在岔道口处向左拐,问采取这种策略能够走到中心。
由于这里不是全DFS,而是具有某种优先级顺序,在这里,优先级是指一直向左拐。判重的时候不能仅仅判断这个格子是否走过,还要加上方向向量,即从什么方向走入这个格子的。
  1 # include <iostream>
  2 # include <cstring>
  3 # include <cstdio>
  4 using namespace std;
  5 char map[105][105];
  6 bool used[105][105][4];//方向:0-向上 1-向右 2-向下 3-向左
  7 int n,m;
  8 int sr=-1,sc=-1;
  9 inline bool chk(int r,int c)
 10 {
 11    if(r+1<n&&r-1>=0&&map[r+1][c]=='#'&&map[r-1][c]=='#'return true;
 12    else if(c+1<m&&c-1>=0&&map[r][c-1]=='#'&&map[r][c+1]=='#'return true;
 13    else return false;
 14 }
 15 inline int encode(int r,int c,int dir)
 16 {  
 17      return (((r<<7)|c)<<2)|dir;
 18 }
 19 inline bool legal(int r,int c)
 20 {
 21    if(r>=0&&r<n&&c>=0&&c<m&&map[r][c]=='.'return true;
 22    else return false;
 23 }
 24 void findstart(int r,int c)
 25 {
 26    if(r>=n||r<0||c>=m||c<0||map[r][c]!='.'return;
 27    if(chk(r,c))
 28    {
 29       sr=r;
 30       sc=c;
 31       return;
 32    }
 33    map[r][c]=' ';
 34    findstart(r+1,c);
 35    findstart(r-1,c);
 36    findstart(r,c+1);
 37    findstart(r,c-1);
 38 }
 39 bool dfs(int r,int c,int dir)
 40 {
 41   // printf("%d %d %d\n",r,c,dir);
 42   // system("pause");
 43    if(used[r][c][dir]) return false;
 44    else
 45    {
 46        if(legal(r,c)&&legal(r+1,c)&&legal(r,c+1)&&legal(r+1,c+1)||
 47           legal(r,c-1)&&legal(r,c)&&legal(r+1,c-1)&&legal(r+1,c)||
 48           legal(r-1,c)&&legal(r,c)&&legal(r-1,c+1)&&legal(r,c+1)||
 49           legal(r-1,c-1)&&legal(r-1,c)&&legal(r,c-1)&&legal(r,c)) 
 50           return true;
 51        used[r][c][dir]=true;
 52        switch(dir)
 53        {
 54          case 0:
 55               if(legal(r,c-1)) return dfs(r,c-1,3);
 56               else if(legal(r-1,c)) return dfs(r-1,c,0);
 57               else if(legal(r,c+1)) return dfs(r,c+1,1);
 58               break;
 59          case 1:
 60               if(legal(r-1,c)) return dfs(r-1,c,0);
 61               else if(legal(r,c+1)) return dfs(r,c+1,1);
 62               else if(legal(r+1,c)) return dfs(r+1,c,2);
 63               break;
 64          case 2:
 65               if(legal(r,c+1)) return dfs(r,c+1,1);
 66               else if(legal(r+1,c)) return dfs(r+1,c,2);
 67               else if(legal(r,c-1)) return dfs(r,c-1,3);
 68               break;
 69          case 3:
 70               if(legal(r+1,c)) return dfs(r+1,c,2);
 71               else if(legal(r,c-1)) return dfs(r,c-1,3);
 72               else if(legal(r-1,c)) return dfs(r-1,c,0);
 73               break;
 74        } ;
 75        return false;
 76    }
 77    
 78 }
 79 int main()
 80 {
 81     //int n,m;
 82     scanf("%d%d",&n,&m);
 83     for(int i=0;i<n;i++)
 84        scanf("%s",map[i]);
 85     for(int i=0;i<n;i++)
 86     {
 87         if(map[i][0]=='.')
 88            findstart(i,0);
 89         if(map[i][m-1]=='.')
 90            findstart(i,m-1);
 91     }
 92     for(int i=0;i<m;i++)
 93     {
 94         if(map[0][i]=='.')
 95            findstart(0,i);
 96         if(map[n-1][i]=='.')
 97            findstart(n-1,i);
 98     }
 99   //  for(int i=0;i<n;i++)
100     //  printf("%s\n",map[i]);
101   //  system("pause");
102     memset(used,false,sizeof(used));
103     if(sr+1<n&&sr-1>=0&&map[sr+1][sc]=='#'&&map[sr-1][sc]=='#')
104        if(sc+1>=m||map[sr][sc+1]==' ')
105           printf("%s\n",dfs(sr,sc,3)?"YES":"NO");
106        else
107           printf("%s\n",dfs(sr,sc,1)?"YES":"NO");
108     else
109        if(sr+1>=n||map[sr+1][sc]==' ')
110           printf("%s\n",dfs(sr,sc,0)?"YES":"NO");
111        else
112           printf("%s\n",dfs(sr,sc,2)?"YES":"NO");
113     //system("pause");
114     return 0;
115            
116 }
117 

posted on 2010-10-15 16:09 yzhw 阅读(179) 评论(0)  编辑 收藏 引用 所属分类: search


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜