简单迷宫最优解问题

本文探讨了一个二维数组表示的迷宫问题,其中1代表墙,0代表通路。目标是找到从起点(1,0)到出口的最短路径。采用递归方法,从起点出发,按上右下左顺序探测可行路径,遇到通路则标记并继续递归。通过Print()函数显示迷宫,CheckIsAccess()判断当前位置是否可达,GetShortPath()利用栈进行递归搜索。测试代码显示了不同场景下,算法能正确找到最优解或识别无解情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里的迷宫问题是将一个二位数组看作是迷宫,里面的数值1为墙,是死路,而0则是通路。
例如下图之中,(1,0)是迷宫入口,红线部分为一条迷宫通路,而后面的黑色圆圈圈住的部分就是一个死胡同

这里写图片描述

而在一个迷宫之中,是会有多条路径可以走出迷宫,今天的任务就是要找到最短的那条路径。
求解迷宫出口的算法是使用递归,从入口进入迷宫,然后从入口的上右下左(顺时针方向,方向可自定义)四个方向探测,探测到下一个位置是通路时可以走,将来时的路做标记 ,并将下一个点变成新的入口(递归子问题), 以此类推,便可以找到所有通路。

struct Pos    //用于存储迷宫位置的行列 
{
    int _row;//行
    int _col;//列
};
template <int M,int N>
class Maze
{
public:
    Maze(int* maze)//用于初始化
    {......}
    void Print();//用于显示
    bool CheckIsAccess(Pos cur, Pos next);//判断是否可以通
    void GetShortPath(Pos cur, stack<Pos>& path, stack<Pos>& shortpath);//标记、寻找通路以及判断最优解
    ~Maze()
    {}
protected:
    int _maze[M][N];
};

利用这几个函数就可以完成所有工作,一个个来看
首先用于显示的Print()函数就是二位数组的显示方法,而CheckIsAccess(cur,next)中,cur为当前的坐标位置,nxet为下一个坐标位置,也是需要判断的位置。当next处的值为0(最原始通路为0)是,肯定可以通过,而标记过后0值被改变,但不影响他的通过性。这里标记放法是在入口处将0换为2,后续通路的值依次递增。

bool CheckIsAccess(Pos cur, Pos next)//判断是否可以通(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值