【Java】宽度优先算法解决迷宫(Maze)问题

正文之前

国庆最后一天,也是准备爆肝五年这个历史性任务开启的前一天,今天很伤,但是么~

《【Java】宽度优先算法解决迷宫(Maze)问题》 蝼蚁聚团求存,强者则与寂寞和星空为伴

哈哈,这句话居然还是我超喜欢的小说之一的作者写的。。。果然,英雄所见略同:

《【Java】宽度优先算法解决迷宫(Maze)问题》

所以,请计算机2018级《人工智能》课堂的兄弟,看到这里就自觉关闭网页吧。。。。我写了一下午。。。想留着纪念下。。不想明天直接就是一大片一样的。。

正文

  1. 作业需求如下,其实很简单啦!~

《【Java】宽度优先算法解决迷宫(Maze)问题》

  1. 需求分析

起点状态其实就对应初始状态,起点可走周围四个方向(过程中需对是否越界,是 否撞墙做出判断,不满足条件都为不可到达的状态,生成子节点时可直接不考虑), 一旦遍历的点为终点这时经历的路径必为最短,即经历的层数最少,当然,此路径并 不唯一,取最先达到终点的路径为优先。

  1. 算法流程(基于宽度优先)
  • 3.1 步骤流程:

一、 从初始节点 S 出发,将初始节点加入队列 Q,此时 Q={(0,0)},已搜索节 点表 C={ };
二、 若队列 Q 为空,则搜索失败,退出;
三、 若队列 Q 不为空,则取出队列 Q 的头结点,检查 C 中是否有该节点; 四、 若有该节点,则退出此线路;
五、 若无该节点,则将该节点置入 C 中,再判断该节点是否为目标节点;
六、 若为目标节点,则由该节点回溯到初始节点,即可得到路径,后退出搜索; 七、 若不是目标节点,那么将该节点扩展,得到其扩展子节点,先过滤掉已经在 C
中存在的子节点,然后设置所有子节点的父节点为当前节点,并且将所有子节
点入队; 八、 回到步骤二.

  • 3.2 关键点分析
    上述步骤中,初始化动作为步骤一,步骤二到步骤八是循环操作。其中有三处跳出 循环的点:
  1. 队列 Q 为空时,代表着所有的节点能从初始点到达的节点都已经搜索完毕,可以 直接结束程序(break);
  2. 如果当前节点是搜索过的节点,那么退出本次循环,进入下次循环(continue); 3. 找到了目标节点,回溯至初始节点后得到路径,完美退出(exit)。

代码放一放:

《【Java】宽度优先算法解决迷宫(Maze)问题》

输出结果如图:

《【Java】宽度优先算法解决迷宫(Maze)问题》

正文之后

我知道这个算法实现写的稀烂的。。。而且讲道理,我觉得很是有点广度优先的意思在里头了。。。这。。很可怕了~ 不过不管了。写了那么久,将就着用吧!溜了,吃饭去了

    原文作者:HustWolf
    原文地址: https://www.jianshu.com/p/514052973cd5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞