解救小哈——bfs广搜

  • 问题描述:

小哈去玩迷宫,结果迷路了,小哼去救小哈。迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物。

问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。(注意:障碍物不能走,小哼也不能走出迷宫外,0表示空地,1表示障碍物)

输入:

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<cstdio>
#include<iostream>
#define INF 10000000
using namespace std;
int a[50][50],b[50][50];
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//四个方向

struct node//用结构体模拟队列
{
    int x;
    int y;
    int s;//记录步数

}que[2505];

int main()
{
    int n,m,sx,sy,ex,ey,tx,ty;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
    //初始化队列
    int head=1;
    int tail=1;
    //将起点入队
    que[tail].x=sx;
    que[tail].y=sy;
    que[tail].s=0;
    tail++;//队尾指针++,队尾指针要指向空队列
    b[sx][sy]=1;//标记起点
    int flag=0;
    //开始广搜
    while(head<tail)//队列不为空
    {
        for(int i=0;i<4;i++)//四个方向搜索
        {
            //计算从父亲(head)点到下一个点
            tx=que[head].x+next[i][0];
            ty=que[head].y+next[i][1];
            if(tx<1||ty<1||tx>n||ty>m)//是否越界
            {
                continue;
            }
            if(b[tx][ty]==0&&a[tx][ty]==0)//这个点没有走过并且是空地
            {
                b[tx][ty]=1;//标记走过,此处与深搜不同,不能还原标记
                //将此点入队
                que[tail].x=tx;
                que[tail].y=ty;
                que[tail].s=que[head].s+1;//父亲(head)的步数加1
                tail++;//队尾指针++
            }
            if(tx==ex&&ty==ey)
            {
                flag=1;
                break;//走到终点
            }
        }
        if(flag==1)
            break;
        head++;//四个方向可以进入路径的都以入队,将head出队
    }
    printf("%d
",que[tail-1].s);//输出最后一个队列元素的步数,tail指向最后一个元素的下一个位置,所以-1
    return 0;
}
原文地址:https://www.cnblogs.com/boboyuzz/p/10417728.html