找到一种算法,可以找到最简单的方法来解决""的问题。游戏

时间:2016-02-20 19:01:42

标签: algorithm

我正在从旧的编程竞赛中解决任务。任务是制作一个程序,可以找到一个可能的解决方案,以及最短的解决方案是什么,对于一个众所周知的游戏版本"熄灯"。简而言之,我们连接了几个灯。通过点击灯光,您可以更改它的状态以及两个相邻的灯光。目标是激活所有灯光。

经典版本的"熄灯"我们正在处理两个维度,但在这个版本中,灯光连接在一个"一维"字符串,其中" edge"连接了。基本上是一圈灯。 灯的数量可以达到10000,所以我尝试的暴力方法显然不够好。它只设法解决有解决方案的版本,以及约10灯以下的版本。以下是可解决设置的示例。 1'标记灯被激活,0标记灯被停用。第一行包括字符串中的灯数。如果解决方案没有激活,程序将输出它是不可能的。请记住,边缘已连接。

5 10101

点击"边缘之一" (无论哪一个,我点击左边的那个)。

01100

点击相反的边缘

11111

如果解决方案没有激活,程序会输出一条消息。如果没有,它会输出最短的解决方案,在这种情况下:2。

有人可以帮我找一个算法吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

假设您知道解决方案中是否存在(如果存在),则需要单击第一个和第二个灯。

一旦我们掌握了这些信息,我们就可以立即推断是否需要点击第三盏灯,因为这是影响第二盏灯的最后一个选择(点击第一盏灯会改变上一个/第一个/第二个灯,点击第二个灯改变第一个/第二个/第三个,点击第三个灯改变第二个/第三个/第四个 - 但没有其他点击可以改变第二个灯。)

同样,我们可以立即推断是否点击第四盏灯,因为这是影响第三盏灯的最后一个选择。

然后,您可以一直工作到最后,看看您是否有一致的解决方案(全部熄灯)。

只需尝试前两个开关的所有4个选项,并选择最佳得分。

复杂度O(4n)