POJ 3083 Children of the Candy Corn DFS及BFS搜索
http://poj.org/problem?id=3083 一开始没明白题意以为只是简单的(顺时针或逆时针),wa一次。。。。 1、至于求最短距离,毋庸置疑,肯定是bfs,这个就不多说了 2、对于向左和向右的理解上,我当初一直不明白,读了老长时间,没有看懂,到discuss里看了一个人的叙述,终于明白意思了……就是这样,一直沿着向左或向右的方向走,能走就走,不能走就回撤,所以这个dfs不能标记遍历过的点,这是很显然的。 3、dfs方向的选择,就是要保证沿着向左或者向右的方向走 ( 向左是顺时针,向右是逆时针转) #include<stdio.h> #include<string.h> #define N 100 #include<queue> using namespace std; char map[N][N]; int step,sx,sy,ex,ey,r,c,vis[N][N]; int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; int dr[4][2]={{0,-1},{1,0},{0,1},{-1,0}}; struct node { int x,y,step; }q[N*N]; void dfs_l(int x,int y,int dir) { if(x==ex&&y==ey)return; int t=(dir+3)%4; int dx=x+dl[t][0]; int dy=y+dl[t][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_l(dx,dy,t); } else { int dx=x+dl[dir][0]; int dy=y+dl[dir][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_l(dx,dy,dir); } else { int t=(dir+1)%4; int dx=x+dl[t][0]; int dy=y+dl[t][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_l(dx,dy,t); } else { int t=(dir+2)%4; int dx=x+dl[t][0]; int dy=y+dl[t][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_l(dx,dy,t); } } } } } void dfs_r(int x,int y,int dir) { if(x==ex&&y==ey)return; int t=(dir+1)%4; int dx=x+dl[t][0]; int dy=y+dl[t][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_r(dx,dy,t); } else { int t=dir; int dx=x+dl[t][0]; int dy=y+dl[t][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_r(dx,dy,t); } else { int t=(dir+3)%4; int dx=x+dl[t][0]; int dy=y+dl[t][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_r(dx,dy,t); } else { int t=(dir+2)%4; int dx=x+dl[t][0]; int dy=y+dl[t][1]; if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { step++; dfs_r(dx,dy,t); } } } } } int bfs(int x,int y) { int head=0,tail=0; q[head].x=x; q[head].y=y; q[head].step=1; vis[x][y]=1; tail++; while(head<tail) { for(int i=0;i<4;i++) { int dx=q[head].x+dl[i][0]; int dy=q[head].y+dl[i][1]; int num=q[head].step; if(dx==ex&&dy==ey)return num+1; else { if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#') { if(!vis[dx][dy]) { vis[dx][dy]=1; q[tail].x=dx; q[tail].y=dy; q[tail].step=num+1; tail++; } } } } head++; } return 0; } int main() { int t,i,j; scanf("%d",&t); while(t--) { scanf("%d%d",&c,&r); getchar(); for(i=0;i<r;i++) { scanf("%s",map[i]); } for(i=0;i<r;i++) { for(j=0;j<c;j++) { if(map[i][j]=='S') { sx=i; sy=j; } if(map[i][j]=='E') { ex=i; ey=j; } } } //printf("%d %d %d %d\n",sx,sy,ex,ey); int dir; if(sx==0) dir=3; else if(sx==r-1) dir=1; else if(sy==0) dir=2; else dir=0; int k=dir; step=0; dfs_l(sx,sy,dir); printf("%d ",step+1); dir=k; step=0; dfs_r(sx,sy,dir); printf("%d ",step+1); memset(vis,0,sizeof(vis)); int ans=bfs(sx,sy); printf("%d\n",ans); } }