BFS找最短路径

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41033913/article/details/79998123

个人觉得找最短路径的就是一个套路问题,但是针对不同题目的处理方法是不同的,但是思想是一致的

我写的是一个比较基本的BFS题目,希望对刚刚接触的人有所帮助。

PS:这是我们学校里比赛的一道题目,比较基础

Description

给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表障碍物不能走,
'A'代表小偷,'B'代表警察,'E'代表出口。每个位置可以向(上,下,左,
右)四个方向走一格,花费一个单位时间,现在给出小偷,警察和出口所在
位置,警察为了捉住小偷会先到出口的位置守株待兔,如果警察在小偷之前
或同时到达出口,或者小偷到达不了出口,输出"No",否则输出"Yes"。

Input

第一行一个整数T(T<=50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表图的行和列
接下来n行,每行为长度为m的字符串,组成一张图

Output

每行输出"Yes"或"No"

Sample Input

2

5 5

....A

##...

E#..B

##...

.....

5 5

A....

.....

B....

...E.

.....

Sample Output

No
No
 
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
#define MAX 505
using namespace std;
struct M
{//需要将数据放到队列里面,所以要用结构体进行储存
    int x,y;//记录所在的坐标
    int ans;//记录从开始到所在点的步数
}now,next;//now表示最开始的状态
//next表示接下来一步步状态

char mp[MAX][MAX];//储存地图
int vis[MAX][MAX];//标记是否走过的数组
int n,m;//行和列

int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
//四个方向遍历的数组

int BFS(int x,int y)
{
    queue<M>q;
    int l,r,coun;
    now.x=x;
    now.y=y;
    now.ans=0;
    //将起点放入队列里面
    vis[x][y]=1;//标记为已经走过了
    q.push(now);
    while(!q.empty()){
        l=q.front().x;
        r=q.front().y;
        coun=q.front().ans;
        //取出队首元素
        if(mp[l][r]=='E')break;
        //判断是否符合退出要求
        coun++;
        //不符合,则步数加一
        //接下来判断是否符合 在范围内 能走 没走过 的要求
        for(int i=0;i<4;i++){
            next.x=l+dx[i];
            next.y=r+dy[i];
            next.ans=coun;
            if(next.x<0||next.y<0||next.x>=n||next.y>=m)
                continue;
            if(mp[next.x][next.y]=='#')
                continue;
            if(vis[next.x][next.y])
                continue;
            vis[next.x][next.y]=1;
            //符合要求,需要将其变为走过,然后入队
            q.push(next);
        }
        q.pop();//弹出队首元素,不断四处遍历找

    }
    return coun;
}

int main()
{
    int T;
    cin>>T;
    while(T--){
        cin>>n>>m;
        for(int i=0;i<n;i++)
            cin>>mp[i];

        int ax=-1,ay=-1,bx=-1,by=-1,flag=0;

        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]=='A'){
                    ax=i;ay=j;
                }
                else if(mp[i][j]=='B'){
                    bx=i;by=j;
                }
                else if(mp[i][j]=='E'){

                    int tx,ty;
                    for(int k=0;k<4;k++){
                        tx=i+dx[k];ty=j+dy[k];
                        if(mp[tx][ty]=='A'||mp[tx][ty]=='B'||mp[tx][ty]=='E'){
                            flag=1;
                            continue;
                        }
                    }
                }
            }
            if(ax!=-1&&bx!=-1&&flag)
                break;
        }

        if(flag==0){
            cout<<"NO"<<endl;
            continue;
        }

        int ans1=0,ans2=0;

        memset(vis,0,sizeof(vis));
        ans1=BFS(ax,ay);

        memset(vis,0,sizeof(vis));
        ans2=BFS(bx,by);

        cout<<ans1<<" "<<ans2<<endl;

        if(ans1>=ans2)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;

    }
    system("pause");
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_41033913/article/details/79998123
今日推荐