NOJ-2076-天神小学-典型BFS题型

题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2076

这是一道典型的BFS题,可由题意知道起始点‘X’,结束位置‘O’, ‘.’是通路,‘* ’是断路,首先是如何输入图形,我选择的是二维字符数组 map,然后用二维数组vis表示这个点是否有走过,然后在BFS函数中使用队列,利用队列的先进先出原则,则当第一个到达出口的点的步数是最小的。最后再和输入的最小步数进行比较得出是否能够跑出天神小学。

具体代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MAX=25;
char map[MAX][MAX];
int vis[MAX][MAX];
int dirtx[4]={1,-1,0,0};  //!
int dirty[4]={0,0,1,-1};
typedef struct point  
{
    int x,y;
    int stepres;
}point;
 int BFS(int x1,int y1,int n,int m) 
{
    memset(vis,0,sizeof(vis));
    queue<point> q;                      //!
    point node,t;
    node.x=x1;
    node.y=y1;
    node.stepres=0;
    vis[node.x][node.y]=1;
    q.push(node);
    while(!q.empty())
    {
        node=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            t=node;
            t.x+=dirtx[i];
            t.y+=dirty[i];
            t.stepres++;
            if(map[t.x][t.y]=='O')
            return t.stepres;
            if(t.x<1||t.y<1||t.x>m||t.y>n||map[t.x][t.y]=='*'||vis[t.x][t.y]==1)
            {
                continue;   
            }
            else 
            {
                vis[t.x][t.y]=1;
                q.push(t);
            }
        }
    }
}
int main()
{
    int T;
    cin>>T;
    int n,m,t;
    while(T--)
    {
        int step=0;
        char s[25];
        memset (map,0,sizeof(map));
        memset (s,0,sizeof(0));
        cin>>n>>m>>t; 
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            for(int j=1;j<=m;j++)
            {
                map[i][j]=s[j-1];
            }
        }
        int x1,y1;//表示起始位置,压入队列中的第一个点 
        int out=0;
        for(int i=1;i<=n;i++)//找到第一个点 
        {
            for(int j=1;j<=m;j++)
            {   
                if(map[i][j]=='X') 
                {
                    x1=i;
                    y1=j;
                    out=1;  
                    break; 
                }   
            }
            if(out==1)
            break;
        }
        step=BFS(x1,y1,n,m);
        if(step<=t)
        {
            cout<<"happy end"<<endl;
        }
        else 
        cout<<"bad end"<<endl;
    }
    return 0;
}

仅代表个人观点,欢迎交流探讨,勿喷~~~

NOJ-2076-天神小学-典型BFS题型_第1张图片

图片来源:http://www.pixiv.net/member_illust.php?illust_id=50263455&mode=medium

你可能感兴趣的:(bfs)