迷宫之广搜算法(B站)

迷宫之广搜算法

题目描述

在这里插入图片描述


核心思路

难点在于如何记录路径:

  • 我们用Pre[]数组来记录某个点是从哪个点走过来的,比如 P r e [ i ] = j Pre[i]=j Pre[i]=j,表示i节点是从j节点走过来的,换句话说,就是i的前驱是j。
  • 我们用 P a t h [ 81 ] [ 2 ] Path[81][2] Path[81][2]来记录路径,第二维中的 [ 0 ] [0] [0]表示横坐标, [ 1 ] [1] [1]表示纵坐标。

当我们要输出路径时:

  • 根据Pre数组,从终点出发,一直找到前驱点,最终递归到起点,那么就可以知道从终点到起点的路径信息,然后回溯时输出从起点到终点的路径信息。

输出路径如下图:

在这里插入图片描述

在这里插入图片描述


代码

在这里插入图片描述

#include<iostream>
using namespace std;
char Map0[9][9]={{".#..."},
                 {".#.#."},
                 {"....."},
                 {".#.#."}
                };
char Map[9][9];
int m=4,n=4;	//m是行数  n是列数
int SouX=3,SouY=1;
int DesX=m,DesY=n;
int Pre[81];
int Path[81][2];
int head,tail;
bool flag,Visited[9][9];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

void ChangeMap()
{
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            Map[i][j]=Map0[i-1][j-1];
}

void Print(int i)
{
    if(Pre[i]!=0)
        Print(Pre[i]);
    printf("%d,%d ",Path[i][0],Path[i][1]);
}

void BFS()
{
    head=0,tail=1;
    Path[tail][0]=SouX;
    Path[tail][1]=SouY;
    Pre[tail]=head;
    Visited[SouX][SouY]=true;
    printf("%d,%d head=%2d tail=%2d\n",SouX,SouY,head,tail);
    while(head!=tail)
    {
        head++;
        for(int i=0;i,4;i++)
        {
            int x=Path[head][0]+dx[i];
            int y=Path[head][1]+dy[i];
            if(Map[x][y]=='.'&&!Visited[x][y])
            {
                tail++;
                Path[tail][0]=x;
                Path[tail][1]=y;
                Pre[tail]=head;
                Visited[x][y]=true;
                printf("%d,%d head=%2d tail=%2d\n",SouX,SouY,head,tail);
                if(x==DesX&&y==DesY)
                {
                    flag=true;
                    Print(tail);
                    break;
                }
            }
        }
        if(flag)
            break;
    }
}
int main()
{
    ChangeMap();
    DFS(SouX,SouY,step);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷心菜不卷Iris

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值