使用回溯算法修改版本的Lights out [复制]

问题描述 投票:2回答:1

这个问题在这里已有答案:

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

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

algorithm backtracking
1个回答
0
投票

The Naive Solution

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

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

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

Greedy-First Search

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

Not All Lights-Out Puzzles Are Solvable

无论您使用什么算法,都可能没有解决方案,这意味着您可能永远搜索(或至少几万亿年),而无需找到解决方案。

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

© www.soinside.com 2019 - 2024. All rights reserved.