【发布时间】:2012-09-20 09:23:51
【问题描述】:
我需要一种算法,它可以为我提供从起始节点到结束节点的路径,但路径必须具有确切数量的节点,否则寻路会失败。
为了展开,我有一个瓷砖网格。只能移动到紧邻的上、下、左或右瓷砖(意思是,没有对角线移动)。在路径中可以使用和不可以使用哪些 tile 有很多规则,但大多数情况下可以归结为一个简单的 bool 来判断该 tile 是否可以使用(这可以在开始算法之前计算. 但是,给我带来麻烦的是,我有一个指定的路径必须具有的距离,这意味着,从一块瓷砖到相邻瓷砖的每一次移动都是 1 的距离,整条路径应该有一个指定的距离,不多也不少。而且,一旦一个瓷砖被踩过(但在算法开始时所有的瓷砖都可用),它就不能再被踩到,有点像玩旧的蛇游戏,你必须注意不要自己吃。
我查看了 Dijkstra/A* 并搜索了寻路算法,但据我所知,所有算法都专注于最短路径,这对我没有多大好处。我不在乎它是哪条路,只要它遵循上述规则即可。
我是否遗漏了什么,是否已经存在这样的算法,或者是否有一种简单的方法可以修改 Dijkstra/A* 来给出这个结果? 由于我不是以英语为母语的人,我可能使用了错误的术语,所以我欢迎为此类算法提供关键字建议。
这是我所说的必须是准确的距离并且不能重复使用同一个图块时的意思。
假设距离必须为 7。现在让我们用 O 标记路径中可以使用的图块,用 X 标记不能使用的图块,用 S 标记起点,用 E 标记目标。
X X X X X X X X O O E S O O X O O O O O O如果没有距离限制,一个人可以向左走,问题就解决了。 如果有距离限制,而不是“不能踩同一块瓷砖”的限制,可以下一次,然后左,然后右,然后左,然后右,然后左,然后上到达目标. 由于存在两种限制,因此需要向右,向下,向左,向左,向左,向上,然后向右才能到达目标。但是,如果情况是这样的话,就没有有效的路径了。
X X X X X X X X O O E S O O X X O O O X O如果相关的话,我正在用 C# 开发这个棋盘游戏。
至于最大距离,这里是距离的范围。 玩家将掷骰子并得到数字 1-6。如果玩家得到一个 6,他再次掷骰子,如果他得到另一个 6,一次又一次,直到他没有得到 6。距离是得到的数字加上玩家捡起的物品数量,理论上可以上升到 8,但通常是 0-3,maaaybe 4。
另一方面,我刚刚收到新订单,游戏规则已更改为允许在同一路径上两次踩同一位置,我相信这大大简化了流程,但我会留下这个问题因为我认为它有很好的答案可以帮助处于这种情况的人。
【问题讨论】:
-
请注意,这个问题是 NP 完全的,通过简化为哈密顿路径问题。另外,请阅读 amit answer here。
-
@Haile: 问题是 NP 完全问题,但在这里你应该更加小心,因为问题中的图表有点受限,你需要减少 every 有效减少的哈密顿路径问题。也就是说,问题中的图是网格图,在其上找到哈密顿路径是 NP 完全的。
-
@Nabb 你是绝对正确的。