迷宫求解(深搜)——递归和非递归

迷宫求解(深搜)——递归和非递归

迷宫问题:

 

问题描述:

存在这样一个迷宫,

int maze[5][5]={
    {0,0,0,0,0},
    {0,1,0,1,0},
    {0,1,1,0,0},
    {0,1,1,0,1},
    {1,0,0,0,0}
};

0 代表可以行进,1 代表不可行进,从起点坐标 (0,0) 出发到终点 (4,4),要求找出一条路。

 

首先来说第一个思路:

对于起点 (0,0) 它现在有两个方向可以走——向右和向下,至于先走哪一步,看你个人喜好,比如说,我规定让它按照 左,下,右,上 的方向,那它就走到 (1,0) 的位置了,然后继续按照这个规则,一直走到 (3,0),很明显,现在按照这个规则会原路返回,那运行一步到达 (2,0),再次运行程序又会走到 (3,0),因为我们要判断 下,而这个方向是可以的,那就需要我们来解决一个问题,如何让程序知道它已经走过的路并且能够在路走不通的时候回退呢?

我们设立一个标志 di,四个方向对应着不同的值,0—左,1—下,2—右,3—上,在进行各个方向试探的时候,我们设置一个变量 find,初始值设为 0,如果可以走,将 find 设为 1,并且将这个位置标记为 -1,然后进行下一个位置的试探,比如我们进行到 (3,0) ,先把它设为 -1,发现无路可走,我们就将刚才的那个位置 (2,0),从 -1 改为 0,然后继续,先改成-1,此时发现仍然无路可走,我们就只能再将它上面的位置从 -1 改为 0,那么这里又有一个问题,如何让程序知道是改它之前走过的位置,而不是再次按照 左,下,右,上 的方向改呢?

这就要用到数据结构中的栈,我们将走过的路压入栈中(严格地说是走过,并且可以继续走下去的路),如果走投无路,我们就需要先原路返回,即出栈,每回退一步都需要再判断有无其他可走的路,如果没有,则继续回退,直到所有可以走的路都走完。注:压入栈里的数据成员有横坐标纵坐标以及走的方向。

 

我们手动运行一遍,首先位置 (0,0),判断可走的方向有 1—下(优先,即判断到这里就停止判断了),2—右,(后面将全用数字代替),将其位置标记为 -1,压入栈中,来到 (1,0),判断可走的方向是 1,标记为 -1,压入栈中,来到 (2,0),标记为 -1,压入栈中,来到 (3,0),走投无路,将其位置标记为-1,将栈顶元素 (2,0) 退栈,标记由 -1 改为 0,此时 3 方向可以走(即回溯),以此类推直到 (0,0),此时 (1,0) 已经被设置为 -1,所以可走的方向只剩下 2,然后继续运行,找到终点后,我们将栈中的内容打印出来,最终会得到

这样的输出结果

这个程序只会找到一条路,至于路径长短不做考虑,具体是哪条路这和你定义的判断方向的顺序有关,本例只有一条路,程序如下(为了方便判断我加了边框):

#include<iostream>

using namespace std;

int maze[5][5]={
    {
      0,0,0,0,0},
    {
      0,1,0,1,0},
    {
      0,1,1,0,0},
    {
      0,1,1,0,1},
    {
      1,0,0,0,0}
};

int index[7][7]={
    {
      1,1,1,1,1,1,1},
    {
      1,0,0,0,0,0,1},
    {
      1,0,1,0,1,0,1},
    {
      1,0,1,1,0,0,1},
    {
      1,0,1,1,0,1,1},
    {
      1,1,0,0,0,0,1},
    {
      1,1,1,1,1,1,1}
};

typedef struct
{
    int i;
    int j;
    int di;
}Box;

typedef struct
{
    Box data[100];
    int
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值