描述
现在我们来简化蛇的身体,假设初始化的时候蛇的身体只有一个头而已(呵,当然是假设的),那么蛇去吃食物的时候就不必考虑碰到自己的身体了。
例:
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…
样例输出
EEESSWWW
题目来源
TZOJ
分析:
求最短路径的轨迹,经典的BFS题,也很简单,当作复习。
代码:
#include<bits/stdc++.h>
using namespace std;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
//0->S 1->N 2->E 3->W
char m[110][110];
int vis[110][110];//标记是否走过
bool f;//用来判断是否找到贪吃蛇。
int R,C;
struct node
{
int x;//横坐标
int y;//纵坐标
string s;//路径记录
};
void BFS(int x,int y)
{
vis[x][y]=1;
node a;//初始
a.x=x;
a.y=y;
a.s.clear();
node b,c;
queue<node>q;
q.push(a);
while(!q.empty())//BFS核心代码
{
b=q.front();
q.pop();
if (m[b.x][b.y]=='E')
//也可以在输入时保存'E'的坐标然后比较。
{
f=1;//标记
cout<<b.s<<endl;
return;//函数结束
}
for (int i=0;i<4;i++)
{
c=b;
c.x+=dx[i];
c.y+=dy[i];
if (vis[c.x][c.y]==0&&c.x>0&&c.x<=R&&c.y>0&&c.y<=R&&m[c.x][c.y]!='#')
{
vis[c.x][c.y]=1;
if (i==0) c.s+='S';
else
if (i==1) c.s+='N';
else
if (i==2) c.s+='E';
else
if (i==3) c.s+='W';
q.push(c);
}
}
}
}
int main()
{
while(cin>>R>>C)
{
int sx,sy;//'S'的横坐标和纵坐标
memset(vis,0,sizeof(vis));
for (int i=1;i<=R;i++)
for (int j=1;j<=C;j++)
{
cin>>m[i][j];
if (m[i][j]=='S')
{
sx=i;
sy=j;
}
}
f=0;
BFS(sx,sy);//广搜
if (f==0)//吃不到食物
cout<<"Can't eat it!"<<endl;
}
return 0;
}