BFS时忘记改变已经搜索的状态而陷入死循环,查了几天的错才找到。
主要是按方向搜索,看了zjydhr的代码,只要给出当前坐标和上次的方向,就可以计算出下一步走到哪儿,而且还不用回溯,其实就一个循环就完事了。
3083 | Accepted | 220K | 0MS | C++ | 1263B | 2009-11-20 21:30:14 |
#include<stdio.h> #include<queue> using namespace std; int m,n,l,r,f,sx,sy,d[2][4]={1,0,-1,0,0,1,0,-1};//顺序按左边:下,右,上,左 char t[41][41]; struct node {int x,y,d;}ct; int bfs(int x,int y) {queue<node> q; node st={x,y,1}; q.push(st); while(!q.empty()) {int i,tx,ty; ct=q.front(); q.pop(); for(i=0;i<4;i++) {tx=ct.x+d[0][i]; ty=ct.y+d[1][i]; if(tx>=0&&ty>=0&&tx<n&&ty<m&&t[tx][ty]!='#') {if(t[tx][ty]=='E') return ct.d+1; node ad={tx,ty,ct.d+1}; t[tx][ty]='#';//忘记这步陷入死循环 q.push(ad); } } } return 0; } int dfs(int x,int y,int z)//z表示方向 {int i; if(t[x][y]=='E') return 1; for(i=0;i<4;i++) {int tx=x+d[0][z]; int ty=y+d[1][z]; if(t[tx][ty]=='.'||t[tx][ty]=='E') { if(f)//左搜 {l++; if(z==3) z=-1; if(dfs(tx,ty,z+1))//方向加1,方向向左 return 1;; } else//右搜 {r++; if(!z) z=4; if(dfs(tx,ty,z-1))//方向减1,方向向右 return 1; } } if(f) {z--; if(z==-1) z=3; } else {z++; if(z==4) z=0; } } return 0; } int main() {int c,i,j; scanf("%d",&c); while(c--) {scanf("%d%d",&m,&n); for(i=0;i<n;i++ ) {scanf("%s",t[i]); for(j=0;j<m;j++) if(t[i][j]=='S') {sx=i; sy=j; } } f=l=r=1; dfs(sx,sy,0); f=0; dfs(sx,sy,0); printf("%d %d %d/n",l,r,bfs(sx,sy)); } }