题目链接
大意就是,摁一个开关,它的前后左右以及他自己的状态都会改变。
原本是开的变成关的,原本是关的变成开的。
我们的任务就是把所有的灯都变成关闭状态。

我们可以这样想象,第一排的灯已近摁完了,确实是正确答案,第一行就不再摁了,于是,要让第一排的灯全部熄灭,就需要通过摁第二行的灯,以此下去后面的灯的状态也就确定了。

#include<iostream>
#include<cstring>
using namespace std;
const int ax[5] = {1, 0, 0, -1, 0};//摁灯的五个点。
const int ay[5] = {0, 1, -1, 0, 0};
int maze[10][10], backup[10][10], ans[10][10];
void turn(int x, int y) {//反转灯的状态。for(int i = 0; i < 5; i++) {int tempx = x + ax[i];int tempy = y + ay[i];if(tempx >= 0 && tempx < 5 && tempy >= 0 && tempy < 6)//是否合理,防止发生数组越界。maze[tempx][tempy] = !maze[tempx][tempy];//取反。}
}
void solve() {memcpy(backup, maze, sizeof maze);//先备份原来一开始的状态,方便后面枚举。for(int i = 0; i < 1 << 6; i++) {//总共有0 ~ (1^6 - 1)种状态。memset(ans, 0, sizeof ans);//清空错误的ans数组,for(int j = 0; j < 6; j++)//如果第j位是1 代表摁过,需要反转与其相关的灯。if(i >> j & 1) {ans[0][j] = 1;turn(0, j);}for(int j = 0; j < 4; j ++)//通过摁后一排的灯来保证前面的灯是合理的状态。for(int k = 0; k < 6; k++)if(maze[j][k] == 1) {ans[j + 1][k] = 1;turn(j + 1, k);}int flag = 1;for(int j = 0; j < 6; j++)//前面的灯已近保证是合理的状态了,if(maze[4][j] == 1) {//检查最后一排的灯是否合理flag = 0;break;}if(flag ) break;//合理直接输出答案。memcpy(maze, backup, sizeof backup);//还原原来的状态,再继续枚举找答案。}for(int i = 0; i < 5; i++) {//得到答案输出。for(int j = 0; j < 6; j++)cout << ans[i][j] << " ";cout << endl;}
}
int main() {//  freopen("D:\\MY\\answer.txt","r",stdin);for(int i = 0; i < 5; i++)for(int j = 0; j < 6; j++)cin >> maze[i][j];solve();return 0;
}

OpenJudge:熄灯问题相关推荐

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

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

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

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

  3. OpenJudge/Poj 2001 Shortest Prefixes

    1.链接地址: http://bailian.openjudge.cn/practice/2001 http://poj.org/problem?id=2001 2.题目: Shortest Pref ...

  4. OpenJudge/Poj 2027 No Brainer

    1.链接地址: http://bailian.openjudge.cn/practice/2027 http://poj.org/problem?id=2027 2.题目: 总Time Limit: ...

  5. 吴昊品游戏核心算法 Round 7 —— 熄灯游戏AI(有人性的Brute Force)(POJ 2811)

    暴力分为两种,一种属于毫无人性的暴力,一种属于有人性 的暴力.前面一种就不说了,对于后面一种情况,我们可以只对其中的部分问题进行枚举,而通过这些子问题而推导到整个的问题中.我称之为有人性的Brute ...

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

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

  7. [OpenJudge] 百练2754 八皇后

    八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. ...

  8. OpenJudge 2739 计算对数

    1.链接地址: http://bailian.openjudge.cn/practice/2739/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 给定两个正整数a和b.可 ...

  9. OpenJudge 2757 最长上升子序列 / Poj 2533 Longest Ordered Subsequence

    1.链接地址: http://poj.org/problem?id=2533 http://bailian.openjudge.cn/practice/2757 2.题目: 总Time Limit: ...

最新文章

  1. 一次失败的Pytorch模型量化尝试
  2. 上班骚扰男同事被抓到......
  3. 天津计算机中级职称需要什么,天津市中级职称评定条件是什么
  4. iOS Social框架
  5. 浅谈Android数据库DBFlow
  6. 2015年职场人薪资惬意度调查报告
  7. CakePHP 3.7.6 发布,PHP 快速开发框架
  8. tab切换中的滚动条下拉分页带来的问题
  9. SSH中常见jar包缺少错误
  10. 拓端tecdat|R语言中的copula GARCH模型拟合时间序列并模拟分析
  11. Linux下安装zookeeper集群,以及在window用dubbo和代码测试
  12. vue 获取本地的json文件内容
  13. 嵌入式单片机学习入门到大牛
  14. (5)air202读取串口数据并上传到阿里云显示
  15. linux配置基于pptp的多用户多出口ip的vpn,PPTP配置多ip出口vpn
  16. 【USACO 2007 February Silver】农场派对
  17. Stata:时变Granger因果检验
  18. 黑白图转RGB(Matlab)
  19. WPF-Interaction.Triggers
  20. vscode terminal点击i编辑,esc退出编辑无效

热门文章

  1. 为什么饮料瓶大都是圆的,牛奶盒却是方的?原因你想不到
  2. 东北大姐剪纸被误认为油画,遭人质疑二十多年,只因太过逼真,看完后:真香!不愧是天下第一剪!...
  3. 拼多多出现大Bug:100无门槛券随便领,一晚损失200亿
  4. 优雅的读懂支持向量机 SVM 算法
  5. 服务器文件每天备份重新命名,定时备份服务器文件至本地电脑
  6. java什么时候可能产生内存溢出_哪些场景会产生OOM?怎么解决?
  7. crt脚本 js 在_crt脚本 js 在_使用SecureCRT自带的脚本录制功能。
  8. capslock键英语怎么读_刚开始读英文原版书该怎么做?商务英语专业有前途吗?...
  9. 计算机应用乘法,计算机系统原理(十) 二进制整数的乘法运算和除法运算
  10. 计算机结构优化,计算机结构与程序优化.ppt