首页 > 代码库 > dfs/poj3083 Children of the Candy Corn

dfs/poj3083 Children of the Candy Corn

  1 #include<cstdio>  2 #include<cstring>  3 #include<queue>  4   5 using namespace std;  6 typedef pair<int,int>P;  7 const int dx[4]={1,0,-1,0};  8 const int dy[4]={0,1,0,-1};  9 const int INF=1e9; 10 int sx,sy,ex,ey,n,m; 11 char a[50][50]; 12 int d[50][50]; 13  14 bool pd(int x,int y) 15 { 16     if (x>=0 && x<n && y>=0 && y<m && a[x][y]!=#) return true; 17     return false; 18 } 19  20 int dfs(int x,int y,int xx,int yy,char d) 21 { 22     if (x==xx && y==yy) return 1; 23     if (d==U) 24     { 25         if (pd(x-1,y)) return dfs(x-1,y,xx,yy,L)+1; 26         else if (pd(x,y-1)) return dfs(x,y-1,xx,yy,U)+1; 27         else if (pd(x+1,y)) return dfs(x+1,y,xx,yy,R)+1; 28         else if (pd(x,y+1)) return dfs(x,y+1,xx,yy,D)+1; 29     } 30     else if (d==L) 31     { 32         if (pd(x,y+1)) return dfs(x,y+1,xx,yy,D)+1; 33         else if (pd(x-1,y)) return dfs(x-1,y,xx,yy,L)+1; 34         else if (pd(x,y-1)) return dfs(x,y-1,xx,yy,U)+1; 35         else if (pd(x+1,y)) return dfs(x+1,y,xx,yy,R)+1; 36     } 37     else if (d==D) 38     { 39         if (pd(x+1,y)) return dfs(x+1,y,xx,yy,R)+1; 40         else if (pd(x,y+1)) return dfs(x,y+1,xx,yy,D)+1; 41         else if (pd(x-1,y)) return dfs(x-1,y,xx,yy,L)+1; 42         else if (pd(x,y-1)) return dfs(x,y-1,xx,yy,U)+1; 43     } 44     else if (d==R) 45     { 46         if (pd(x,y-1)) return dfs(x,y-1,xx,yy,U)+1; 47         else if (pd(x+1,y)) return dfs(x+1,y,xx,yy,R)+1; 48         else if (pd(x,y+1)) return dfs(x,y+1,xx,yy,D)+1; 49         else if (pd(x-1,y)) return dfs(x-1,y,xx,yy,L)+1; 50     } 51 } 52  53 int bfs(int sx,int sy,int ex,int ey) 54 { 55     int v[50][50]; 56     for (int i=0;i<50;i++) 57         for (int j=0;j<50;j++) d[i][j]=INF; 58  59     queue<P> que; 60     que.push(P(sx,sy)); 61     d[sx][sy]=1; 62     while (que.size()) 63     { 64         P p=que.front(); 65         que.pop(); 66         if (p.first==ex && p.second==ey) break; 67         for (int i=0;i<4;i++) 68         { 69             int nx=p.first+dx[i]; 70             int ny=p.second+dy[i]; 71             if (pd(nx,ny) && d[nx][ny]==INF) 72             { 73                 que.push(P(nx,ny)); 74                 d[nx][ny]=d[p.first][p.second]+1; 75             } 76        } 77     } 78     return d[ex][ey]; 79 } 80 int main() 81 { 82     int tot; 83     scanf("%d",&tot); 84     for(int t=1;t<=tot;t++) 85     { 86         scanf("%d%d",&m,&n); 87         for (int i=0;i<n;i++) 88         { 89             scanf("%s",a[i]); 90             for(int j=0;j<m;j++) 91             { 92                 if (a[i][j]==S) 93                 { 94                     sx=i; 95                     sy=j; 96                 }else 97                 if (a[i][j]==E) 98                 { 99                     ex=i;100                     ey=j;101                 }102             }103         }104       //  printf("%d %d\n",ex,ey);105         int ans2=dfs(sx,sy,ex,ey,U);106         int ans1=dfs(ex,ey,sx,sy,U);107         int ans3=bfs(sx,sy,ex,ey);108         printf("%d %d %d\n",ans1,ans2,ans3);109     }110     return 0;111 }

 

dfs/poj3083 Children of the Candy Corn