迷宫救援bfs解法

迷宫救援bfs解法
在一个有n行m列的单元格组成的迷宫中,0代表空地,1代表障碍物,有一名迷路者小红,还有一名救援者小明
输入n1,n2代表小明的出发位置;输入m1,m2代表小红的被困位置,
请输出小明找到小红所需的最短路途(规定一个单元格代表一个长度单位)
样例输入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
样例输出:
7


#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,m1,m2;
int a[51][51],b[51][51];//储存迷宫
int book[51][51];//标记是否走过
int as[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//这个用来表示向右,向左,向下,向上;
struct note
{
    int x;
    int y;
    int f;//这个用来标记父元素
    int s;//这个是记录步数
}que1[2502];//这个用来模拟队列;
int main()
{
    int n1,n2;
    int head=1,tail=1;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            b[i][j]=a[i][j];
        }
    }
    scanf("%d%d%d%d",&n1,&n2,&m1,&m2);
    book[n1][n2]=1;
    int jieshu=0;//这个用来标记是否结束
    que1[tail].f=0;
    que1[tail].s=0;
    que1[tail].x=n1;
    que1[tail].y=n2;
    tail++;
    while(head<tail){
        for(int i=0;i<4;i++){
            int tx=que1[head].x+as[i][0];
            int ty=que1[head].y+as[i][1];
            if(tx<1||tx>n||ty<1||ty>m){
                continue;
            }
            if(a[tx][ty]==0&&book[tx][ty]==0){//判断下一步是否能走以及是否以及走过
                book[tx][ty]=1;
                que1[tail].f=head;//标记父元素
                que1[tail].s=que1[head].s+1;
                que1[tail].x=tx;
                que1[tail].y=ty;
                tail++;
            }
            if(tx==m1&&ty==m2){
                jieshu=1;
                break;
            }
        }
        if(jieshu==1){
            break;
        }
        head++;
    }
    cout<<que1[tail-1].s<<endl;
    tail=tail-1;
    b[n1][n2]=2;//2表示寻找时的路径
    while(que1[tail].f!=0){
        int tx=que1[tail].x;
        int ty=que1[tail].y;
        b[tx][ty]=2;
        tail=que1[tail].f;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<b[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值