解题思路:BFS加路径。用广搜求出最短路径,用biao结构体保存每个最短路径的前一步。通过终点依次存下前一步的坐标,一直到起点,最后判断方向输出。
1 #include <cstring> 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 char tu[105][105]; 7 int n,m; 8 int startx,starty,endx,endy; 9 int head,tail,xx,yy; 10 int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}}; 11 struct dui 12 { 13 int x,y,s; 14 }; 15 dui que[10500]; 16 struct biao 17 { 18 int x1,y1; 19 }road[105][105]; 20 int bfs() //返回最短路径的步数 21 { 22 head=tail=0; 23 tail++; 24 que[tail].x=startx; 25 que[tail].y=starty; 26 que[tail].s=0; 27 while(head<tail) 28 { 29 head++; 30 if(que[head].x==endx&&que[head].y==endy) 31 return que[head].s; 32 for(int i=0;i<4;i++) 33 { 34 xx=que[head].x+dir[i][0]; 35 yy=que[head].y+dir[i][1]; 36 if(xx>=1&&xx<=n&&yy>=1&&yy<=m) 37 { 38 if(tu[xx][yy]!='#') 39 { 40 tu[xx][yy]='#'; //走过的路标记为# 41 tail++; 42 que[tail].s=que[head].s+1; 43 que[tail].x=xx; 44 que[tail].y=yy; 45 road[xx][yy].x1=que[head].x; //保存前一步 46 road[xx][yy].y1=que[head].y; 47 } 48 } 49 } 50 } 51 return 0; 52 } 53 int main() 54 { 55 while(~scanf("%d%d",&n,&m)) 56 { 57 memset(que,0,sizeof(que)); 58 memset(road,0,sizeof(road)); 59 memset(tu,0,sizeof(tu)); 60 for(int i=1;i<=n;i++) 61 for(int j=1;j<=m;j++) 62 { 63 cin>>tu[i][j]; 64 if(tu[i][j]=='S') 65 startx=i,starty=j; 66 if(tu[i][j]=='E') 67 endx=i,endy=j; 68 } 69 tu[startx][starty]='#'; 70 int sum=bfs(); 71 dui ans[105]; 72 if(sum==0) //找不到路径返回0,就是吃不到。 73 { 74 printf("Can't eat it! "); 75 continue; 76 } 77 int ex=endx,ey=endy; 78 for(int i=1;i<=sum;i++) //依次保存上一步坐标 79 { 80 ans[i].x=road[ex][ey].x1; 81 ans[i].y=road[ex][ey].y1; 82 ex=ans[i].x; 83 ey=ans[i].y; 84 } 85 ans[0].x=endx;ans[0].y=endy; 86 for(int i=sum-1;i>=0;i--) //判断方向并输出 87 { 88 int dx=ans[i].x-ans[i+1].x; 89 int dy=ans[i].y-ans[i+1].y; 90 if(dx==1) 91 printf("S"); 92 if(dx==-1) 93 printf("N"); 94 if(dy==1) 95 printf("E"); 96 if(dy==-1) 97 printf("W"); 98 } 99 printf(" "); 100 } 101 return 0; 102 }