迷宫及其最短路

一、 代码实现迷宫
迷宫的路径可以用两种方法来求解:
1.回溯法(利用栈)来求解迷宫路径;
2.递归方法(利用递归函数自己创建的栈帧)来求解路径;
回溯法求解迷宫基本思想:
首先来讲一下回溯法求解迷宫,创建一个栈,用来存储走过的路径(注意栈顶元素是走过的路,所以要标记,避免走重复的路径 ),将入口压入栈中,先判断入口的四个方向是否有通路,如果下一个路径是通的,则把这个点的坐标压入栈中,(再继续判断它的四个方向)一直循环,如果满足出口条件return true,如果当前路径的四个方向都没有通路,利用回溯法,标记回溯路径,pop当前栈顶元素,再判断它的四个方向是否有通路,一直循环。
在找通路的过程中,当前可走路径的四个方向进行循环顺序不同,可能找所花费的时间,空间(栈帧)就不同,有可能一次性就找到了,有可能要用到回溯法,判断中间路径中其他方向没有走过的路径之后的路。如下面图中迷宫,如果判断四个方向顺序是:上下左右,直接就能找到通路,不需要用到回溯路径求解,但如果判断通路顺序改为:上右下左,则到中间有两条路径的地方会先走右边的那条路,但是这条路径最后会走到死胡同里,则要用到回溯法,再把之前没走的路径判断一下,走没走过的路径,看是否能找到通路。
循环条件:栈不为空, 如果栈为空说明能走过的路全走过了,没有通路。
注意:
路是否为通的判断;
压栈,出栈的条件,以及找到迷宫出口条件
迷宫 入口坐标(2,0)

1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
0 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 0 0
1 1 0 1 1 1 1 1 1 1

回溯法求解迷宫示意图:

这里写图片描述

递归方法(利用递归函数操作系统自动创建的栈帧)来求解路径:
函数主要功能:判断四个方向上的点是否为通路,如果为通路,则判断以这个点为起点的四个方向是否可以走,如果可以走继续递归调用这个函数;当走到四个方向都不能通的地方时给当前的路标记,然后return false,表示路径不能通。

递归求迷宫解示意图:

这里写图片描述

3.利用递归方法求解迷宫最短路径

  迷宫最短路径,与递归求迷宫路径相似,不过它在找到一个路可以走时不会返回(return),而是继续调用递归函数,改变了标记,开始入口直接设为2,下一个可以走的路标记为3,依次递增。
  函数参数有三个(入口点,存放路径的栈,存放最短路的栈),找到出口时,当最短路径>路径长度或最短路径栈为空时,让路径设为最短路径,当找遍所有方向,所有路径都走过时,return false,可以通过标记得到最短路(如果有出口),在调试中可以看到栈path,shortPath的变化情况。
    注意迷宫入口点值的设置;
    判断这个点可走的函数需要修改,在合法位置里(横纵坐标值的范围),且这个点值为0(return true),若在合法位置里,坐标值为1(return false),在合法位置里,它的下一个点的标记值大于当前点的标记值+1(return true),合法位置之外(return false)。
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
2 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 0 0 0 0 1 1
1 1 0 1 0 1 1 0 1 1
1 1 0 0 0 0 0 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 1 1

迷宫最优解求解过程图解:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值