搜索题,广搜。滴答答。写的蛮顺畅的,挺满意的。 ‘S’是出发的地方。‘X’是结束的地方。‘W’不能走。‘B’可以走。 dir数组存移动方式。非常裸的BFS。。。。 以下是代码。 #include <iostream> using namespace std; int fi,la,sx,sy,ex,ey,n,m; int dir[8][2]={-1,0,1,0,0,-1,0,1,-2,-2,-2,2,2,-2,2,2}; char map[20][20]; struct queue{ int x; int y; int cnt;//走到该点的步数 }coo[200]; void BFS() { int i,nx,ny; while(fi<la) { map[coo[fi].x][coo[fi].y]='W';//标记已经走过 for(i=0;i<8;++i) { nx=coo[fi].x+dir[i][0]; ny=coo[fi].y+dir[i][1]; if(nx>=0&&ny>=0&&nx<n&&ny<m) { if(map[nx][ny]=='X') { printf("%d/n",coo[fi].cnt+1); return;//找到即可退出函数 } else if(map[nx][ny]!='W') { coo[la].x=nx; coo[la].y=ny; coo[la].cnt=coo[fi].cnt+1; la++; } } } fi++; } printf("NO ANSWER/n"); } int main() { int t,i,j; scanf("%d",&t); while(t--) { scanf(" %d%d",&n,&m); for(i=0;i<n;++i) { for(j=0;j<m;++j) { scanf(" %c",&map[i][j]); if(map[i][j]=='S') sx=i,sy=j; else if(map[i][j]=='X') ex=i;ey=j; } } fi=la=0; coo[la].x=sx; coo[la].y=sy; coo[la].cnt=0; la++;//把起点推入队列。 BFS(); } return 0; }