【发布时间】:2015-12-04 06:20:25
【问题描述】:
几天前我遇到了一个难题。用手很容易解决。但我试图建立一个算法来解决它。但我不知道我应该如何进行。
在这里您可以看到我必须连接所有彩色点对。例如,我需要将黄点连接到另一个黄点,将绿色连接到其他绿色,将蓝色连接到蓝色等等。
所以你可以看到我将黄点与另一个黄点连接起来。蓝色与另一种蓝色。但这会导致一个问题。如您所见,我已经挡住了浅绿色的路径。我希望你能明白。
所以我想解决它。蛮力方法会起作用,但需要很长时间,我对此不感兴趣。我尝试实现广度优先搜索、深度优先搜索和 Dijkstra 算法。但我认为在这种情况下他们不会很好。如果我错了,请纠正我。 A* 搜索可能有效,但启发式方法是什么?
谁能给我一些关于如何解决问题的直觉?
【问题讨论】:
-
如我所见,您示例的任何解决方案都将包含阻塞对。这种情况下算法应该怎么做?
-
A* 会比 BFS 快很多。你需要找出一个启发式。一种对有效解决方案进行评分的方法。这样 A* 就可以朝着最好的分数前进。您需要使用一个状态对象来跟踪当前的板状态。每一步都将是一个由启发式评分的新状态
-
这也是Android上的Flow Free游戏。它使用相对较小的棋盘尺寸,大约
12x12,所以通过一些优化,蛮力应该运行得很快。 -
其实interjay在cmets上说的都是真的。这是一个NP完全问题。我不知道启发式是否可行。 A* 会快很多。但是计算启发式将是困难的。你能给我一些直觉吗?