bfs入门之迷宫

迷宫
Description

小C最近在研究机器人,他想看看自己的机器人够不够智能,于是他将机器人放在一个n*m的迷宫中,看看机器人能不能在最短的时间内到达目的地,可是小C不知道最短的时间是多少,现在请你帮他算算机器人到达目的地的最短时间是多少?

输入数据第一行两个整数n和m。
接下来n行,每行m个元素,表示迷宫的每个方格。
'S'表示机器人的出发点,
'T'表示目的地,
'#'表示该方格不能通过
'.'表示可以通过

输出一个整数表示机器人到达目的地的最短时间,如果机器人不能到达目的地,输出-1。

3 3
S..
##.
.T.

5
解题思路:

1.从起点开始,先将其加入队列,设置距离为0;
2.从队列首端取出位置,将这个位置能达到的地方加入队列,并且让这些位置的距离变成上一个位置加一。

3.循环2直到将终点添加到队列中,这说明我们已经找到了路径。
注意到在这个过程中,每次处理的位置所对应的距离是严格递增的,因此一旦找到终点,当时的最短距离就是最短距离。

同样基于这个原因,搜索课移动到的位置所使用的判断条件中不仅仅是不碰墙壁,不超过边界,还有一个就是没有到达过,因为如果已经到达过这个位置,说明已经有更短的路径到达这个位置,这次到达这个位置的路径是更差的,不可能得到更好的最终解。
ac代码:

#include<bits/stdc++.h>
using namespace std;
int sx,sy,tx,ty;
#define inf 0x3f3f3f3f
typedef pair<int,int>P;
char maze[1005][1005];
int n,m,flag=0;
int d[1005][1005];//储存起点到某一点的距离
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs(){
    queue<P>que;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            d[i][j]=inf;
        }
    }
    que.push(P(sx,sy));
    d[sx][sy]=0;
    while(que.size()){
        P p=que.front();
        que.pop();
        int i;
        for(i=0;i<4;i++){
            int nx=p.first+dx[i];
            int ny=p.second+dy[i];
            if(nx>=0&&nx<n&&ny<m&&ny>=0&&maze[nx][ny]!='#'&&d[nx][ny]==inf){
                que.push(P(nx,ny));
                d[nx][ny]=d[p.first][p.second]+1;
                if(nx==tx&&ny==ty) {
                    flag=1;
                    break;
                }
            }
        }
        if(i!=4) break;
    }
}
int main()
{
    int i,j;
    cin>>n>>m;
    for(i=0;i<n;i++){
        cin>>maze[i];
    }
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            if(maze[i][j]=='S'){
                sx=i;
                sy=j;
            }
            if(maze[i][j]=='T'){
                tx=i;
                ty=j;
            }
        }
    }
    bfs();
    if(flag)
        cout<<d[tx][ty]<<endl;
    else
        cout<<"-1"<<endl;
    return 0;
}

============================================================================参考博客
声明:本文来自 疯狂的指针 的CSDN博客,链接:http://blog.csdn.net/lrgdongnan/article/details/51773728
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值