Bootstrap

关灯游戏 Lights out (二)(首行枚举+位运算,搜索全部解)

         关灯游戏的简介就不介绍了,还不了解的朋友可点击笔者的上一篇博文----关灯游戏 Lights out (一)(极速求解)

         在这一篇给大家介绍“关灯游戏”的枚举算法。

         枚举算法很简单,就是枚举所有开关操作,然后逐一检索经过各种操作后局面的最终状态,当灯全灭时输出解。

         对一个m×n的灯阵,并不需要枚举整个局面2^(m×n)种开关组合。因为任意一种操作,首行的操作就决定了后面所有行的操作都是唯一确定的,不存在其它可能。

      原因很简单,因为能影响第一行灯的亮/灭状态,只可能是第二行的操作组合,并且能让第一行灯全灭的操作是唯一的;接下来,能影响第二行灯的亮/灭状态,只可能是第三行的操作组合,并且能让第二行灯全灭的操作是唯一的...依此类推。所以,当第一行的开关操作确定了,为了使得每一行的灯全灭,后面所有行的开关操作也都确定了。

         请看下面图示例子:


         一个5×5的灯阵,假设一开始全部灯全亮,如上图所示。


        假如某一种开关操作,它的第一行操作如上图所示(1代表对该灯开关操作一次,下同)。


 第一行开关操作完毕,局面灯的亮/灭状态如上图所示。

       此时我们看到,第一行两端盏两盏灯灭了,中间三盏灯还是亮的。为了使第一行灯全灭,接下来对第二行必须对中间三盏灯开关操作一次,并且不可以操作第二行两端两盏灯,第二行的操作是唯一确定的。(对以后所有行的操作依此类推)


操作完第二行后,局面灯的亮灭状态如上图所示。

;