1252:走迷宫

#include<bits/stdc++.h>
using namespace std;
struct node{//新增step以记录所走步数 
    int x,y,step;
}que[2510];
char mp[50][50];//地图 
int f,r;//队首,队尾 
int n,m;//行列 
int fx[4][2]={{0,-1},{0,1},{1,0},{-1,0}};//方向 
void bfs(int x,int y){
    f=r=1;//初始化队列 
    que[r].x=x , que[r].y=y , mp[x][y]='#' , que[r].step=1;//插入,并将脚下设为已走,注意,这里的最短步数是要算上第一步的 

    while(f<=r){
        node t;
        t.x=que[f].x , t.y=que[f].y , t.step=que[f].step;//记录队首 
        if(t.x==n-1 && t.y==m-1){//判断是否走到右下角 
            cout<<t.step<<endl;//输出步数 
            break;
        }
        for(int i=0;i<4;i++){
            int nx=t.x+fx[i][0];//下一步的横坐标 
            int ny=t.y+fx[i][1];//下一步的纵坐标 
        
            if(nx>=0 && nx<n && ny>=0 && ny<m && mp[nx][ny]=='.'){//约束条件 
                mp[nx][ny]='#';//将当前位置改成已走过 
                r++;//准备入队 
                que[r].x=nx;
                que[r].y=ny;
                que[r].step=t.step+1;//每遍历一次步数+1 
            }
        }
        f++;//队首出队 
    }
}
int main(){
    //输入 
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>mp[i];
    //从左上角开始,即从(0,0)开始遍历 
    bfs(0,0);
    return 0;
} 

 

posted @ 2020-10-05 20:36  ssdaeda  阅读(741)  评论(0编辑  收藏  举报