#1282. 走出迷宫

走出迷宫

Description

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。



#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
usingnamespacestd;
intn,m,vis[110][110];////用来标记有没有走过(有没有在队列中)
intdir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//定义方向 上右下左
chara[110][110];
structnode{
    intr,c,step;//row ,column,step
};
voidbfs(intsr,intsc,inter,intec){
    intk;
    memset(vis,0,sizeof(vis));
    queue<node> qe;//定义队列
    node q,t;//q表示当前队头位置,t表示下一个位置
    q.r=sr,q.c=sc,q.step=0;//把起点入队
    vis[sr][sc]=1;//记录已经走过
    qe.push(q);//入队
    while(!qe.empty()){
        q=qe.front();//取出队头元素
        qe.pop();
        if(er==q.r&&ec==q.c){//到出口了
            printf("%d",q.step);
            break;
        }
        for(k=0;k<4;k++){//继续搜索4个方向
           t.r=q.r+dir[k][0],t.c=q.c+dir[k][1];
             //如果没有出迷宫、并且该位置可走、没走过
            if(0<=t.r&&t.r<n&&0<=t.c&&t.c<m&&vis[t.r][t.c]==0&&a[t.r][t.c]=='.'){
                vis[t.r][t.c]=1;//走到这个位置
                t.step=q.step+1;
               qe.push(t);
            }
        }
    }   
}
intmain(){
    inti,j,sr,sc,er,ec;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)scanf("%s",a[i]);//读入字符数组 a[i]表示每行的首地址
      
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)//求出入口和出口的位置
            if(a[i][j]=='S')sr=i,sc=j;
            elseif(a[i][j]=='T')er=i,ec=j,a[i][j]='.';
    bfs(sr,sc,er,ec);//把出口和入口作为参数
    return0;
}

Input Format

第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。

接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。

Output Format

输出从起点到出口最少需要走的步数。


3 3
S#T
.#.
...
6

Source

搜索