其他分享
首页 > 其他分享> > 【ybt1252】走迷宫

【ybt1252】走迷宫

作者:互联网

(还是蛮经典的一道bfs)

显然算法bfs

【传送门】


 

算法基本上算是bfs的模板了,(模板详见【新知识】队列&bfs【洛谷p1996约瑟夫问题&洛谷p1451求细胞数量】

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int r,c;
char a1[50];
bool vis[50][50];//用来存储是否走过(显然第一遍走过时用的步数最小qwq)
int a[50][50];//存map
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};//每一步可以走的四个方向
struct amazing{
    int x,y;
    int ans;
};//结构体,ans存的是到达这一个点的最小步数qwq
amazing fz(int x,int y,int z){
    amazing rtn;
    rtn.x=x;
    rtn.y=y;
    rtn.ans=z;
    return rtn;
}//一个类似于构造函数的fz函数
bool pan(int x,int y){
    return x>=1&&x<=r&&y>=1&&y<=c&&vis[x][y]==0&&a[x][y]==0;
}//判断是否满足可以走的条件
queue<amazing> q;
int main(){
    scanf("%d%d",&r,&c);
    for(int i=1;i<=r;i++){
        scanf("%s",a1);
        for(int j=1;j<=c;j++){
            if(a1[j-1]=='.')
            a[i][j]=0;
            if(a1[j-1]=='#')
            a[i][j]=1;
        }//把地图构造成01型
    }
        q.push(fz(1,1,1));//把第一步也就是起点入队
    vis[1][1]=1;
    while(!q.empty()){//bfs模板
        amazing h=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int xx=h.x,yy=h.y,ans=h.ans;//这里之前踩过坑qwq,一定要定义在循环里这一句,要不然会炸
            if(pan(xx+dx[i],yy+dy[i])){
                xx+=dx[i];
                yy+=dy[i];
                vis[xx][yy]=1;
                q.push(fz(xx,yy,ans+1));//走出这一步,ans+1
            }
            if(xx==r&&yy==c){//判断到没到终点
                cout<<ans+1<<endl;//因为要算头尾,所以到终点后应输出ans+1
                return 0;
            }
            
        }
        
    }
    return 0;
}

end-

标签:ybt1252,int,rtn,迷宫,50,bfs,ans,include
来源: https://www.cnblogs.com/zhuier-xquan/p/10744713.html