1254 走出迷宫

因为这道题的根本性质上就是迷宫模板,所以具体讲解看我的 1215 迷宫 即可

链接:https://www.cnblogs.com/qwn34/p/13732506.html

上代码 BFS()

#include<bits/stdc++.h>
using namespace std;
struct node{//结构体方便存放同一个点的横纵坐标及每走一步的步数 
    int x,y,step;
}que[10010];
int f,r;//队首队尾 
char mp[105][105];//地图 
int n,m,sx,sy,edx,edy;//地图行列,起始位置,终点 
int fx[4][2]={{1,0},{-1,0},{0,-1},{0,1}};//方位 

void pr(){//测试函数 
    cout<<"-------"<<endl;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<mp[i][j];
        }
        cout<<endl;
    }
}

void bfs(int x,int y){
    f=r=1;//队列初始化    
    que[r].x=x , que[r].y=y , que[r].step=0 ,mp[x][y]='#';//将起点信息插入队尾,并将其记录为已走 
    
    while(f<=r){
        node t;
        t.x=que[f].x , t.y=que[f].y , t.step=que[f].step;//获取队首信息 
        
        if(t.x==edx && t.y==edy){//达到条件时输出,并直接退出即可 
            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]='#';//将当前位置标记为已走过 
//                pr();
                r++;
                que[r].x=nx;//插入队尾 
                que[r].y=ny;
                que[r].step=t.step+1;//并计数 
            }
        }
        f++;//队首出队 
    }
}
int main(){
    //输入 
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>mp[i];
//    pr();

    //记录起点和终点,并将其转化为可走的'.' 
    for(int i=0;i<n;i++){ 
        for(int j=0;j<m;j++){
            if(mp[i][j]=='S'){
                sx=i , sy=j;
                mp[sx][sy]='.';
            }
            if(mp[i][j]=='T'){
                edx=i , edy=j;
                mp[edx][edy]='.';
            }
        }
    }
//    cout<<sx<<" "<<sy<<endl;
//    cout<<edx<<" "<<edy<<endl;
    bfs(sx,sy);
    return 0;
} 

感谢支持!!

posted @ 2020-10-06 09:28  ssdaeda  阅读(379)  评论(0编辑  收藏  举报