【问题标题】:Algorithm to get through a maze穿越迷宫的算法
【发布时间】:2010-03-19 14:23:33
【问题描述】:

我们目前正在编写一个游戏(它是一种非常未知的语言:模 2), 我们遇到的问题如下:我们在一个 17 x 12 的网格中有一个迷宫(不是一个完美的迷宫)。计算机必须生成从起点 (9, 12) 到终点 (9, 1) 的路径。我找到了一些算法,但是当机器人必须返回时它们不起作用:

xxxxx
    x
=>  x
    x
  xxx

或:

    xxxxx
        x
xxxxxx  x
     x  x
     x  x
xxxxxx  x
=>      x
xxxxxxxxx

我找到了第一种示例类型的解决方案,但无法解决第二种类型,我为第二种类型编写的解决方案会导致机器人陷入第一种情况。

代码很多,所以我会给出想法:

WHILE(未到达终点)DO { 尝试向右走,如果没有什么阻碍你:向右走 如果遇到障碍,尝试向上直到可以向右,如果向上不能再向下尝试,直到向右,(从第一次被阻止的地方开始),如果向下不能再尝试一步离开并用块填充您测试的空间。 }

这适用于第一种类型的问题......不适用于第二种问题。 现在可能是我开始错了,所以我愿意接受更好的算法或解决方案,特别是如何改进我的算法。

非常感谢!!

【问题讨论】:

    标签: algorithm maze


    【解决方案1】:

    我想我记得你的算法只有在你从一个入口进入迷宫、拥抱一堵墙并尝试出去时才有效。例如,如果你从迷宫中间的一个“岛”开始,它就行不通。

    查看Breadth-first search。这也将为您提供到您想去的任何单元的最短路径。基本上这个想法是你不想访问同一个单元格两次(没有理由)所以从每个单元格分支出来。

    对于您的第一个示例。您可能可以识别出这种模式,数字是从箭头开始到达每个单元格所需的步数。

    xxxxx
    3212x
    2101x
    3212x
    43xxx
    

    当然,如果您愿意,您可以通过跟踪每个单元格的最佳先前路径来重建该单元格所采用的路径。

    广度优先搜索的工作原理是假设每个网格单元之间的距离是一个常数。如果相邻单元格之间的距离不同,你可以看看这类问题:Shortest path problem。

    【讨论】:

      【解决方案2】:

      您可能需要实现寻路算法,因为您不仅想找到任何方式,还想找到可能的最短方式。最流行的寻路算法是Dijkstra 和A*。如果您知道整个迷宫的布局,它将为您提供从一个点到另一个点的最短路径。

      【讨论】:

        【解决方案3】:

        你认为问题是一个角色穿过迷宫。我不会那样做的。我会把迷宫想象成一系列隧道,水流过它们(这意味着答案会流向各个方向)。因此,如果您要将迷宫表示为 2 空间字符串数组,使用 null(或其他一些字符作为墙),使用不同的分隔符作为尚未发现的位置(例如“o”),其余为到达该方格的最短路径(使用“n”、“e”、“s”和“w”)。然后,遍历一个循环,每次,每个方格都会查看它是否可以扩展到另一个方格(如果方格中有一个 'o'),然后,它将添加该方格的串联版本的字符串必须到下一个方格,char 代表到达那里所需的移动。当你找到结束方块时,你就完成了。

        【讨论】:

          【解决方案4】:

          您要解决的问题称为寻路。有很多方法,从简单的蛮力到惊人的A*。维基百科有一个很好的概述here。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-25
            • 2015-06-02
            • 1970-01-01
            • 2013-04-16
            • 2014-09-25
            相关资源
            最近更新 更多