题目描述
有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。

请你写一个程序,确定需要按下哪些按钮,恰好使得所有的灯都熄灭。根据上面的规则,得:
1)第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。因此,每个按钮最多只需要按下一次;
2)各个按钮被按下的顺序对最终的结果没有影响;
3)对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭第1行的全部灯。如此重复下去,可以熄灭第1 ~ 4行的全部灯。同样,按下第1 ~ 5列的按钮,可以熄灭前5列的灯。

输入数据
输入由5行组成,每一行包括6个数字(0或1)。相邻两个数字之间用单个空格隔开。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。

输出要求
输出由5行组成,每一行包括6个数字(0或1)。相邻两个数字之间用单个空格隔开。其中的1表示需要把对应的按钮按下,0则表示不需要按对应的按钮。

样例输入

0 1 1 0 1 0
1 0 0 1 1 1
0 0 1 0 0 1
1 0 0 1 0 1
0 1 1 1 0 0

样例输出

1 0 1 0 0 1
1 1 0 1 0 1
0 0 1 0 1 1
1 0 0 1 0 0
0 1 0 0 0 0

解题思路:

如何枚举?
因为灯有30盏,按钮有开关两种状态,如果一次性枚举需要的次数为230,明显复杂度太大。但是,我们知道第一行的灯是由第一行的按钮得状态和第二行的按钮的状态确定,就是说,如果第一行的按钮的状态确定后,那么相续的第二行的按钮的状态也确定了。因此我们只需要枚举第一行的按钮的状态就可以了,枚举次数为26 = 64。

如何确定按钮的状态?
因为一盏灯被按钮开关两次后其灯的状态不变,那么确定一个按钮的状态时可以用异或的方式实现。即:
ans[i][j] = block[i-1][j] ^ ans[i-1][j] ^ ans[i-1][j-1] ^ ans[i-1][j+1] ^ ans[i-2][j]

如何判断是否熄灭全部的灯?
当第五行的按钮的状态确实能够后,如果没有关闭到第四行或第五行的灯,由
ans[6][j] = block[5][j] ^ ans[5][j] ^ ans[5][j-1] ^ ans[5][j+1] ^ ans[4][j] 可知,将需要由第6行(边界按钮)的按钮来关闭,即会改变第6行的值,将 0 变为 1 。那么可以用 if(ans[6][j] == 1) 来判断。

如何枚举第一行的按钮的状态?
把这一行的6个按钮比喻为6位的二进制数,即000000 ~ 111111 。
把这64种情况一一枚举,直至匹配成功。

0 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 1 0
0 0 0 0 1 1
0 0 0 1 0 0
0 0 0 1 0 1.. . . .
1 1 1 1 1 1
#include<iostream>
using namespace std;
int ans[7][8] , block[6][7];
bool check()
{for(int i=2;i<=6;i++){for(int j=1;j<=6;j++){ans[i][j] = block[i-1][j] ^ ans[i-1][j] ^ ans[i-1][j-1] ^ans[i-1][j+1] ^ ans[i-2][j];}}for(int j=1;j<=6;j++)if(ans[6][j] == 1)return false;return true;
}void solve()
{for(int i=0;i<64;i++)  //枚举64次{int k = i;for(int j=6;j>=1;j--){ans[1][j] = k%2; //变为二进制k/=2;}if(check())break;}for(int x=1;x<=5;x++){for(int y=1;y<=6;y++){cout<<ans[x][y]<<" ";}cout<<endl;}
}int main()
{for(int i=0;i<8;i++)ans[0][i]=ans[6][i]=0; // 确定边界按钮状态for(int j=1;j<6;j++)ans[j][0]=ans[j][7]=0; // 确定边界按钮状态for(int x=1;x<=5;x++)for(int y=1;y<=6;y++)cin>>block[x][y];cout<<"\n"<<"\n";solve();
return 0;
}

熄灯问题(枚举)——C++相关推荐

  1. 【C语言】熄灯问题 枚举法

    Description 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行.每个按钮的位置上有一盏灯.当按下一个按钮后,该按钮以及周围位置(上边.下边.左边.右边)的灯都会改变一次.即,如果灯原来是点 ...

  2. 枚举--遍历搜索空间的例子:熄灯问题

    问题描述 有一个由按钮组成的矩阵,其中每行有6 个按钮,共5 行.每个按钮的位置上有一盏灯. 当按下一个按钮后,该按钮以及周围位置(上边.下边.左边.右边)的灯都会改变一次.即, 如果灯原来是点亮的, ...

  3. 【算法-枚举】熄灯问题 通俗详细的解题叙述(OpenJudege-2811)

    算法–熄灯问题 对于该问题的描述: https://www.bilibili.com/video/av10046345/?p=4 #p4熄灯问题 http://bailian.openjudge.cn ...

  4. 算法思想(枚举)——百钱百鸡+生理周期+完美立方+熄灯问题+讨厌的青蛙

    枚举的思想其实时日常生活中提取的一种智慧 ^------^ 枚举的思想在生活中有着非常广泛的应用        在对事物进行归纳推理时,会逐一考察某个事物的所有可能的情况,并且逐一进行检验,这就是枚举 ...

  5. 枚举的应用:熄灯问题讨厌的青蛙

    1.枚举的基本思想 1.枚举应用举例: Q:寻找小于N的最大素数(素数(质数):除了1和本身,不能被其他数整除的数) N-1?     N-2?     N-3... 2.枚举的定义: 从可能的答案中 ...

  6. OPJ 2.1基本算法之枚举:熄灯问题

    OPJ 2.1基本算法之枚举 1813:熄灯问题 题目传送门 个人认为这是这一章为数不多不水的题之一--可能是我太弱了 思路: 既然这道题是枚举"算法"里的,那肯定就是要枚举.那么 ...

  7. POJ1222熄灯问题(枚举练习题)

    文章目录 题目描述 题目分析 代码(Java) 题目描述 这道题来自 POJ1222 ,题目描述如下: 有一个由按钮组成的矩阵,其中每行有 6 个按钮,共 5 行.每个按钮的位置上有一盏灯.当按下一个 ...

  8. OpenJudge2811:熄灯问题(枚举)

    熄灯问题 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行.每个按钮的位置上有一盏灯.当按下一个按钮后,该按钮以及周围位置(上边.下边.左边.右边)的灯都会改变一次.即,如果灯原来是点亮的,就会被熄 ...

  9. 枚举-熄灯问题(算法基础 第2周)

    枚举-熄灯问题 问题讲解: 分析 讲解的很好了,再说就是画蛇添足. 源码 #include <stdio.h>int puzzle[6][8], press[6][8]; /* 推测验证过 ...

  10. [C++][枚举]熄灯问题

    1.题目 2811:熄灯问题 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行.每个按钮的位置上有一盏灯. ...

最新文章

  1. Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)
  2. Elsevier的Greg Landrum访谈 | 成功的开源化学信息软(RDKit)的要素是什么?
  3. WP 前台或后台显示ShellToast
  4. 马斯克:人脑“带宽”有限,需要用人工智能加持提高连接速度
  5. 再论SAP云平台上CloudFoundry编程环境的connectivity
  6. Node Sass does not yet support your current environment
  7. vue内容横向循环滚动_vue文字横向滚动公告
  8. resultset不支持循环遍历_二叉树的各种遍历方法的简单解释
  9. Google Chrome 势要消灭不安全的非 HTTPS 页面!
  10. B站视频下载:如何下载B站视频到电脑上
  11. 什么是同源策略,为什么浏览器要使用同源策略
  12. Unity 2d - 基础 - 碰撞(一) - 针对性碰撞
  13. linux怎么进tmp目录,关于linux下tmp文件夹
  14. 手机怎么识别图中文字?这两个方法靠谱
  15. mysql sid是什么_数据库名、数据库实例、全局数据库名、服务名、SID等的区别
  16. 数据链路层——局域网扩展
  17. 慎用php的array_search函数
  18. 编译原理实验二-逆波兰式生成程序
  19. python 高精度时间_如何基于Python代码实现高精度免费OCR工具
  20. 在uni-app中使用element-ui

热门文章

  1. 郑州远程教育的计算机和英语统考,郑州大学网络远程教育统考大学英语B6练习题...
  2. beyond compare 4 mac最新特点
  3. 微信小程序开发之大转盘 仿天猫超市抽奖
  4. Raspberry Zero 功耗
  5. MySql按周,按月,按日分组统计数据、日期计算。并统计环比、同比
  6. 低头敲代码,抬头看方向!| Java15新特性发布
  7. Linux删根不跑路之修复rm -rf /bin
  8. xlinx_pcie_ip 使用笔记
  9. [luogu p1074] 靶型数独
  10. lua中判断一个字符串是否是合法的ip地址格式