Algorithm 层次求解与寻径

Algorithm 层次求解与寻径,algorithm,language-agnostic,path-finding,Algorithm,Language Agnostic,Path Finding,我最近玩了一个叫flash的小游戏,非常喜欢这个概念 游戏的基本目标是在每个广场上修剪一次整个草坪。你的割草机从瓷砖上启动,从那里你可以向各个方向移动(除了有墙挡住你的地方)。如果你在草地上跑步不止一次,它将恶化,你将失去水平。只能向左、向右、向上或向下移动。 但是,当您完成游戏时,会添加更多瓷砖: 只能修剪一次的瓷砖(草) 一块瓷砖,你可以在它变质之前碾压两次(较高的草) 有一点你可以想看多少就看多少 你无法翻过的瓷砖(墙) 如果你不明白我的意思,去玩游戏,你会明白的 我成功地编写了一个蛮

我最近玩了一个叫flash的小游戏,非常喜欢这个概念

游戏的基本目标是在每个广场上修剪一次整个草坪。你的割草机从瓷砖上启动,从那里你可以向各个方向移动(除了有墙挡住你的地方)。如果你在草地上跑步不止一次,它将恶化,你将失去水平。只能向左、向右、向上或向下移动。 但是,当您完成游戏时,会添加更多瓷砖:

  • 只能修剪一次的瓷砖(草)
  • 一块瓷砖,你可以在它变质之前碾压两次(较高的草)
  • 有一点你可以想看多少就看多少
  • 你无法翻过的瓷砖(墙)
如果你不明白我的意思,去玩游戏,你会明白的

我成功地编写了一个蛮力算法,它只需要第一种瓷砖(这基本上是问题的一种变体)就可以解决难题。然而,这并不是最优的,只适用于具有只能运行一次的磁贴的谜题。我完全不知道如何处理多余的瓷砖

给定一个起点和一个平铺图,是否有一种方法或算法来找到将解决该级别的路径(如果可以解决)?我不在乎效率,这只是我心中的一个问题。我很好奇你要怎么解决它

我不是在寻找代码,只是寻找指南,或者如果可能的话,寻找过程的纯文本解释。但是,如果您确实有伪代码,请共享!:)

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

旅行推销员有一个DP

也许您可以修改它(添加更多的片段时重新计算)。
对于一片长草,您可能会将其拆分为两个节点,因为您必须访问它两次。然后将两个节点重新连接到其周围的节点。

问题是有限的,因此,当然,有一个算法

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

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

  • 每个连续的混凝土块首先被简化为单个图形顶点,然后移除顶点,因为混凝土块区域实际上只是一种移动到其他瓷砖的方式
  • 每个较高的草平铺将替换为两个顶点,这两个顶点连接到原始邻居,但彼此不连接
示例:G=草,T=高草,C=混凝土

G G T
G C T
C C G
将其视为一个图表:

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

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

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

然后将T,T'替换为G。现在,图形不再是矩形网格,但它只包含草节点


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

哇,成功了!真不敢相信我没有想到这一点。考虑到转化后的问题,你正在图中寻找一个。确定是否存在这样的路径。有关可能的算法,请参阅。@FlorianBrucker感谢您的链接,直到今天才知道。请记住,对于某些图形类来说,它不是NP完全的。例如,在实心网格图中,即没有“孔”(或:墙)的网格中,问题是多项式时间可解的。