【BFS】简单版贪吃蛇

描述

现在我们来简化蛇的身体,假设初始化的时候蛇的身体只有一个头而已(呵,当然是假设的),那么蛇去吃食物的时候就不必考虑碰到自己的身体了。
例:

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;
}

发布了122 篇原创文章 · 获赞 0 · 访问量 4650

猜你喜欢

转载自blog.csdn.net/Skynamer/article/details/104172785