这个问题在这里已有答案:
游戏由一个8乘8的灯光组成,当游戏开始时,随机打开这些灯光。按下其中一个灯将打开和关闭它旁边的四个灯。对角线邻居不受影响。游戏提供了一个难题:给定一些初始配置,其中一些灯亮,一些关闭,一些不可用,目标是关闭所有灯,最好是尽可能少按钮按下。
任何人都可以告诉我使用迭代回溯来解决这个问题的正确方法吗?
首先,您需要一种方法来表示电路板的状态和堆栈来存储所有状态。在每一步,制作一块板,改为新的状态。将该状态与您目前遇到的所有董事会状态进行比较。如果您还没有看到它,请将该状态推到堆栈顶部并继续下一步。如果您已经看过它,请尝试下一步行动。在从堆栈弹出状态(回溯)之前,每个级别都必须尝试所有可能的64个移动。您将需要使用递归来管理下一步要检查的状态。
最多有264种可能的电路板配置,这意味着您可能会进入一长串独特的状态并且仍然会耗尽内存。 (作为参考,1 GB是230字节,您需要至少8个字节来存储电路板配置)此算法不太可能在已知Universe的生命周期内终止。
你需要做一些聪明的事情来减少你的搜索空间......
您可以通过首先搜索最接近已解决配置的状态来做得更好。在每个步骤中,按照从大多数灯关闭到最少灯关闭的顺序对可能的移动进行排序。按顺序迭代。这应该可以很好地工作,但不能保证获得最佳解决方案。
无论您使用什么算法,都可能没有解决方案,这意味着您可能永远搜索(或至少几万亿年),而无需找到解决方案。
在浪费任何时间试图找到解决方案之前,您需要检查电路板的可解决性(事实证明这是一个更快的算法)。