美文网首页Java 杂谈计算机杂谈程序员
【Java】宽度优先算法解决迷宫(Maze)问题

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

作者: 张照博 | 来源:发表于2018-10-07 18:12 被阅读142次

    正文之前

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

    蝼蚁聚团求存,强者则与寂寞和星空为伴

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

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

    正文

    1. 作业需求如下,其实很简单啦!~
    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)问题

        本文链接:https://www.haomeiwen.com/subject/sualaftx.html