遊戲簡介
這是個很有意思的益智遊戲,如果關掉了一個電燈周圍的電燈也會觸及開關,要将所有電燈熄滅還需要你周密的設計才行,大家快來試試吧!
遊戲規則
《關燈遊戲 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的解了。