【BFS】(二)迷宫一(高懒预警)

之前在学校的积分练习上,做到一道典型的bfs,可以说是 抓牛问题 的升级版

题目如下:

Description

你突然不小心困在迷宫里面了。作为一个五一还在勤奋刷题的ACMer,这个问题简直太简单了。事不迟疑,赶紧写代码吧!

Input

多组数据 每组数据以两个正整数开头,分别代表迷宫的长和宽 接下来是n行,每行m个字符,代表迷宫的地图。 n < 100 , m < 100
其中 ‘M’ 代表你的位置, ‘E’ 代表出口 ‘1’ 代表墙,‘0’代表可走的路 你只能 上下左右 移动。

Output

每组数据输出一个整数,表示你走出迷宫的最短步数。

Sample Input
2 2
S0 1E

Sample Output

2

大概思路很简单,还是求出最短路长度就行。
closed表用二维数组存深度
open表用 pair 类型的 queue
愉快BFS
懒得测试,大意如下:(没检查过,当成伪代码吧)

#include <cstdio>
#include <queue>
#include <utility>

using namespace std;
const int INF = 100000000;

typedef pair<int,int> P;

char maze[105][105];
int m,n;
int sx,sy;
int gx,gy;

int d[105][105];//depth

int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};//move

//(sx,sy) to (gx,gy) shortest --INF
int bfs()
{
    queue<P> que;
    //init all to INF
    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();
        if(p.first == gx&&p.second == gy)break;

        for(int i=0;i<4;i++){
            int nx = p.first + dx[i], ny = p.second + dy[i];
            if(0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny]!= '#' &&
               d[nx][ny] == INF){        //movable
                    que.push(P(nx,ny));
                    d[nx][ny] = d[p.first][p.second] + 1;
               }
        }
    }
    return d[gx][gy];
}


int main()
{
    scanf("%d%d",&m,&n);
    getchar();

    //get maze
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%c",&maze[i][j]);
        }
        getchar();
    }



    int res = bfs();
    printf("%d\n",res);
    return 0;
}

————觉得不加有点空—————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值