使用回溯算法修改版本的Lights out

时间:2017-12-15 20:29:32

标签: algorithm backtracking

游戏由一个8乘8的灯光组成,当游戏开始时,随机打开这些灯光。按下其中一个灯将打开和关闭它旁边的四个灯。对角线邻居不受影响。游戏提供了一个难题:给出一些初始配置,其中一些灯亮,一些关闭一些不可用,目标是关闭所有灯,最好按钮按下尽可能。

任何人都能告诉我使用迭代回溯来解决这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:0)

天真的解决方案

首先,您需要一种方法来表示电路板的状态以及存储所有状态的堆栈。在每个步骤中,制作电路板的副本,更改为新状态。将该状态与您目前遇到的所有董事会状态进行比较。如果您还没有看到它,请将该状态推到堆栈顶部并继续下一步。如果您已经看过它,请尝试下一步行动。在从堆栈弹出状态(回溯)之前,每个级别都必须尝试所有可能的64个移动。您将需要使用递归来管理下一步要检查的状态。

最多有2个 64 可能的电路板配置,这意味着您可能会进入一个非常长的独特状态链并且仍然会耗尽内存。 (作为参考,1 GB是2 30 字节,您需要至少8个字节来存储电路板配置)此算法不太可能在已知Universe的生命周期内终止。

你需要做一些聪明的事情来减少搜索空间......

贪婪的第一次搜索

您可以通过首先搜索最接近已解决配置的状态来做得更好。在每个步骤中,按照从大多数灯关闭到最少灯关闭的顺序对可能的移动进行排序。按顺序迭代。这应该可以很好地工作,但不能保证获得最佳解决方案。

并非所有熄灯拼图都可以解决

无论您使用何种算法,都可能没有解决方案,这意味着您可能会在没有找到解决方案的情况下永远搜索(或至少几万亿年)。

在浪费任何时间尝试寻找解决方案之前,您需要检查电路板的可解决性(事实证明这是一个更快的算法)。