描述
现在我们来简化蛇的身体,假设初始化的时候蛇的身体只有一个头而已(呵,当然是假设的),那么蛇去吃食物的时候就不必考虑碰到自己的身体了。
例:
5 5
.....
S....
###.#
E....
#####
那么从S到E最短的走法是EEESSWWW。说明:N(north),S(south),W(west),E(east)。如果吃不到食物就输出Can't eat it!
注意:路径是最短的走的。
输入
输入数据有多组,每组输入的第一行是两个正整数R,C,表示行和列,3=<R,C<=100,下面输入R行C列的矩阵。
输入保证合法。
输出
每行输出最短的走法。
样例输入
5 5 ..... S.... ###.# E.... #####
样例输出
分析:很简单的bfs,关键是要输出路径,每个节点存储之前走过的路径即可。
代码:
#include <cstring> #include <iostream> #include <queue> #include <cstdio> using namespace std; int n,m,dir[4][2]= {-1,0,1,0,0,-1,0,1}; int vis[200][200],ex,ey,sx,sy,flag; char map[200][200]; struct node { int x; int y; char c[101]; }; void bfs(int x,int y) { node a,p,b; int i; vis[x][y]=1; a.x=x; a.y=y; memset(a.c,'\0',sizeof(a.c)); queue<node>Q; Q.push(a); while(!Q.empty()) { b=Q.front(); Q.pop(); if(map[b.x][b.y]=='E') { flag=1; printf("%s\n",b.c); return ; } for(i=0; i<4; i++) { p=b; p.x=p.x+dir[i][0]; p.y=p.y+dir[i][1]; if(map[p.x][p.y]!='#'&&p.x>=0&&p.y>=0&&p.x<n&&p.y<m&&vis[p.x][p.y]==0) { vis[p.x][p.y]=1; if(i==0) strcat(p.c,"N"); if(i==1) strcat(p.c,"S"); if(i==2) strcat(p.c,"W"); if(i==3) strcat(p.c,"E"); Q.push(p); } } } } int main() { int i,j; while(cin>>n>>m) { memset(vis,0,sizeof(vis)); for(i=0; i<n; i++) for(j=0; j<m; j++) { cin>>map[i][j]; if(map[i][j]=='S') { sx=i; sy=j; } } flag=0; bfs(sx,sy); if(flag==0) printf("Can’t eat it!\n"); } return 0; }