【问题标题】:Level solving and pathfinding关卡求解和寻路
【发布时间】:2013-08-21 22:54:57
【问题描述】:

我最近玩了一个名为Just A Trim Please 的小游戏,非常喜欢整个概念。

游戏的基本目标是通过在每个方格上走一遍来修剪整片草坪。您的割草机从瓷砖开始,您可以从那里向各个方向移动(除了有墙挡住您的地方)。如果您多次在草地瓷砖上奔跑,它会恶化并且您将失去关卡。您只能向左、向右、向上或向下移动。 但是,当您完成游戏时,会添加更多图块:

  • 只能修剪一次(草)的瓷砖。
  • 一块你可以碾过两次的地砖,然后就会变质(高草)。
  • 您可以随心所欲地体验(具体)。
  • 不能翻过的地砖(一堵墙)。

如果你不明白我的意思,去玩游戏你就会明白的。

我设法编写了一个蛮力算法,它可以只用第一种图块解决难题(这基本上是Knight's Tour 问题的变体)。然而,这不是最佳的,只适用于只能运行一次的拼图。我完全不知道如何处理多余的瓷砖。

给定一个起点和一个瓦片地图,有没有办法或算法找到解决关卡的路径(如果可以解决的话)?我不在乎效率,这只是我想到的一个问题。我很好奇你要怎么去解决它。

我不是在寻找代码,只是在寻找指南,或者如果可能的话,是对程序的纯文本说明。如果您确实有伪代码,那么请分享! :)

(另外,我不完全确定这是否与寻路有关,但这是我的最佳猜测。)

【问题讨论】:

    标签: algorithm language-agnostic path-finding knights-tour


    【解决方案1】:

    问题是有限的,所以,当然,有一个算法。

    非确定性算法可以通过猜测正确的动作然后验证它们是否有效来轻松解决问题。该算法可以通过使用例如回溯搜索来确定。

    如果您想将额外的瓷砖(较高的草和混凝土)减少到标准草,您可以这样进行:

    • 每个连续的混凝土块首先被缩减为单个图形顶点,然后删除该顶点,因为混凝土块区域实际上只是移动以到达其他图块的一种方式。
    • 每个较高的草块都被替换为两个顶点,这些顶点与原始邻居相连,但彼此不相连。

    示例:G = 草,T = 高草,C = 混凝土

    G G T
    G C T
    C C G
    

    将其视为一个图表:

    现在把混凝土块改掉。首先将它们缩小为一个(因为它们都已连接):

    然后移除顶点,“通过”它连接:

    然后展开高草瓷砖,将副本连接到与原件相同的节点。

    然后将 T, T' 替换为 G。您现在有一个不再是矩形网格但仅包含草节点的图形。

    当且仅当原始问题可以解决时,转换问题才能解决,并且您可以将转换问题的解决方案转换为原始问题的解决方案。

    【讨论】:

    • 哇,成功了!不敢相信我没有想到这一点。
    • 鉴于转换后的问题,您正在图中寻找Hamiltonian path。判断是否存在is NP-complete这样的路径。有关可能的算法,请参阅this post on SO
    • @FlorianBrucker 感谢您的链接,直到今天才知道。
    • 请记住,对于某些图形类,它不是 NP 完全的。例如,在实心网格图中,即没有“孔”(或:墙)的网格,问题是多项式时间可解的。 link
    【解决方案2】:

    旅行推销员有一个 DP approach

    也许您可以对其进行修改(随着添加的更多部分重新计算)。 对于一块长草,您也许可以将其分成两个节点,因为您必须访问它两次。然后将两个节点重新连接到它周围的节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 2018-09-18
      • 2021-06-25
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多