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