游戏简介
这是个很有意思的益智游戏,如果关掉了一个电灯周围的电灯也会触及开关,要将所有电灯熄灭还需要你周密的设计才行,大家快来试试吧!
游戏规则
《关灯游戏 Lights Out》是一款简单的益智游戏,能够开启思维能力。1995年就发布了,说起规则大家就都明白了,一个点阵中的各个点分为明、暗两种状态,如果点击一个点,则该点会改变状态,同时上下左右四个点也会改变状态,最终要求将点阵中的点全部点亮或者全部熄灭。
求解方法
首先我们要将这个游戏的过程转化为数学模型。
显然地,对于一个方格,会影响到它的方格只有它本身和与它相邻的4个方格(对于边界的方格来说,相邻的方格不足4个)。
并且很容易发现,每一个方格我们要么不点击,要么点击1次,因为点击一个方格两次及以上是没有任何意义的。每点击两次就相当于没有点击。
对于方格i,我们用0表示不点击它,用1表示点击它,记作Si。
每盏灯的状态只有开或者关,我们用0和1表示方格i状态,方格i的初始状态记为Mi。
可以看出,每盏灯i的最终状态只与Mi+Si+Sk1+Sk2+....+Skp(k1...kp是枚举与i相邻的所有方格)的奇偶性有关。
既然只与奇偶性有关,我们就可以用异或运算来表示它。
也就是说,对于每盏灯i,我们都可以得到一个方程Mi xor Si xor Sk1 xor Sk2 xor...xorSkp=0。
等式右边的0表示最后每盏灯的状态都是关闭的。
这个方程其实也就等价于Si xor Sk1 xor Sk2 xor ... xor Skp=Mi。
我们得到了Tot个这样的方程(Tot是灯的数量,即Tot=n*m),共有Tot个未知数(即Tot个Si),就是一个异或方程组。
由于游戏给定的初始状态一定有解,所以我们是一定可以求出这个异或方程组的一组解的。
那么下面的问题就是:怎样求解异或方程组?
显然,我们要使用高斯消元来求异或方程组的解。
这个过程与使用高斯消元求解普通的线性方程组相似(如果不了解高斯消元可以看一下Wikipedia-高斯消去法),只是每次在一个方程中消去一个未知数的时候,不是将这个方程乘上一个系数后与另一个方程相减,而是将这个方程的系数与另一个方程的系数进行异或运算,两个方程右边的数也要一起进行异或。
这样就可以求出Lights Out的解了。



















