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

本文介绍了关灯游戏的枚举算法,通过枚举首行的开关操作,利用位运算快速判断所有解。对于m×n的灯阵,只需枚举2^n种操作,时间复杂度O(2^n)。文章提供了C++代码实现,展示如何在无解时自动判断并输出所有解。
摘要由CSDN通过智能技术生成

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

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

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

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

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

         请看下面图示例子:


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


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


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

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


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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值