这个游戏是Buttonia.com(目前还没有实现该算法),一种类似熄灯游戏的游戏。你有一个按钮网格,每次按下一个按钮都会改变一些相邻按钮的状态。目前,我生成一个随机的游戏配置,然后尽可能地应用启发式方法。其余的则通过暴力搜索来解决。
到目前为止,我的进展是创建了一组方程来模拟游戏。由于每个按钮需要改变奇数次状态才能最终处于关闭状态,因此它的方程式如下:
button_A = 1 - (button_1 + button_2 + ... + button_X) % 2
其中,button_1到button_X是对button_A产生影响的按钮状态。如果有些按钮不依赖于其他按钮,则可以立即解决它们。对于剩下的情况,我会尝试一种配置,直到出现冲突,然后回溯。
目前,这个算法适用于较小的游戏配置。我已经测试了从3x3游戏到10x10大小的游戏。其中6x6是实际游戏的上限。
这些方程式大大减少了暴力搜索的范围,使其变得实用。可能有一种纯数学方法来解决这个方程组。
以下是使用ASCII字符展示的3x3游戏(来自buttonia.com/?game=2964):
||#
-o-
+#|
Legend:
o = affect only self
- = affect left and right neighbors
| = affect above and below neighbors
+ = affect left, right, above and below neighbors
# = affect all 8 surrounding neighbors
解决方案,按照以下顺序点击: (0,0), (2,0), (1,2), (0,1), (1,1), (2,1)
这个游戏的方程式:
Button_0_0 = 1 - (0) % 2
Button_1_0 = 1 - (Button_2_0) % 2
Button_2_0 = 1 - (0) % 2
Button_0_1 = 1 - (Button_0_0 + Button_0_2 + Button_1_2) % 2
Button_1_1 = 1 - (Button_1_0 + Button_2_0 + Button_0_1 + Button_2_1 + Button_1_2) % 2
Button_2_1 = 1 - (Button_2_0 + Button_1_2 + Button_2_2) % 2
Button_0_2 = 1 - (Button_1_2) % 2
Button_1_2 = 1 - (Button_0_2) % 2
Button_2_2 = 1 - (Button_1_2) % 2
可能的解决方案:
改变数学函数以避免需要模数,让我们能够将左侧的项移到右侧,创建我们需要使用高斯方法的整洁矩阵设置。因此,前两个方程式分别转换为:
-1 = -1*B00 + 0*B10 + 0*B20 + 0*B01 + 0*B11 + 0*B21 + 0*B02 + 0*B12 + 0*B22
-1 = 0*B00 + -1*B10 + -1*B20 + 0*B01 + 0*B11 + 0*B21 + 0*B02 + 0*B12 + 0*B22
在这里讨论了解决方案:使用自定义运算符的高斯消元
接近成功。几乎可以发布完整的解决方案:翻转二进制网络