解救小哈

题目描述

有一天,小哈一个去玩迷宫。但是方向感很不好的小哈很快就迷路了。小哼得知后便立即去解救无助的小哈。小哼当然是有备而来,已经弄清楚了迷宫地图,现在小哼要以最快速度去解救小哈。问题就此开始了…… 迷宫由n×m
列的单元格组成,每个单元格要么是空地,要么是障碍物。你的任务是帮助小哼找到一条从迷宫的起点到小哈所在位置的最短路径,注意障碍物是不能走的,当然也不能走到迷宫之外(n,m≤100)。

输入
第一行有两个数n和m。n表示迷宫的行,m表示迷宫的列。接来下来n行m列为迷宫,0表示空地,1表示障碍物。最后一行4个数,前两个数为迷宫入口的x和y坐标。后两个为小哈的x和y坐标。
输出
一个整数表示小哼到小哈的最短步数。如果不能解救小哈则输出No Way!

样例输入

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
3 3
1 1 1 
0 1 0 
0 1 0 
2 1 3 3

样例输出

7
No Way!

思路:BFS
注意:数组下标,越界判断

#include<bits/stdc++.h>
using namespace std;
struct note
{
    int x;
    int y;
    int f;
    int step;
};

int main()
{
    struct note que[2505];
    int mp[51][51]= {0},book[51][51]= {0};

    int next[4][2]= {0,1,1,0,0,-1,-1,0};//方向数组
    int head,tail;
    int n,m;
    while(cin>>n>>m)  //数据多组输入
    {
        int i,j;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=m; j++)
            {
                cin>>mp[i][j];
            }
        }
        int startx,starty,p,q;
        cin>>startx>>starty>>p>>q;
        head=1;
        tail=1;
        que[tail].x=startx;
        que[tail].y=starty;
        que[tail].f=0;
        que[tail].step=0;
        tail++;
        book[startx][starty]=1;
        int flag;//标记是否到达目标点
        flag=0;
        int tx,ty;
        while(head<tail)
        {
            for(int k=0; k<=3; k++)
            {
                tx=que[head].x+next[k][0];
                ty=que[head].y+next[k][1];
                if(tx<1||tx>n||ty<1||ty>m)
                {
                    continue;
                }
                if(mp[tx][ty]==0 && book[tx][ty]==0)
                {
                    book[tx][ty]=1;
                    que[tail].x=tx;
                    que[tail].y=ty;
                    que[tail].f=head;
                    que[tail].step=que[head].step+1;
                    tail++;
                }
                if(tx==p && ty==q)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)break;
            head++;
        }

        if(flag==1)cout<<que[tail-1].step<<endl;
        else  if(flag==0)
        {
            cout<<"No Way!"<<endl;
        }

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值