你玩过“拉灯”游戏吗?

2525 盏灯排成一个 5×55×5 的方形。

每一个灯都有一个开关,游戏者可以改变它的状态。

每一步,游戏者可以改变某一个灯的状态。

游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。

我们用数字 11 表示一盏开着的灯,用数字 00 表示关着的灯。

下面这种状态

10111
01101
10111
10000
11011

在改变了最左上角的灯的状态后将变成:

01111
11101
10111
10000
11011

再改变它正中间的灯后状态将变成:

01111
11001
11001
10100
11011

给定一些游戏的初始状态,编写程序判断游戏者是否可能在 66 步以内使所有的灯都变亮。

输入格式

第一行输入正整数 nn,代表数据中共有 nn 个待解决的游戏初始状态。

以下若干行数据分为 nn 组,每组数据有 55 行,每行 55 个字符。

每组数据描述了一个游戏的初始状态。

各组数据间用一个空行分隔。

输出格式

一共输出 nn 行数据,每行有一个小于等于 66 的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。

对于某一个游戏初始状态,若 66 步以内无法使所有灯变亮,则输出 −1−1。

数据范围

0<n≤5000<n≤500

输入样例:

3
00111
01011
10001
11010
1110011101
11101
11110
11111
1111101111
11111
11111
11111
11111

输出样例:

3
2
-1

解题思路:根据第一行已有的数据 我们可以有2的5次方次按法 (选择按还是不按),然后根据我们的按法变化的数据; 从头开始去进行查询、改变灯的状态,因为你每次操作肯定会把前四行的灯都弄亮,我们的第五行的数据就没有办法再进行变化了,所以我们最后只需要判断最后一行灯是否全亮。如果可以完成的话 我们只需要把完成的次数存下来,存最小的数就行了。                               

具体可以看代码里面的注释。
memcpy 可以用来进行原数据备份 然后操作e 每进行完一次开关的按法之后再还原回去 再操作

AC

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;const int N = 6;char e[N][N], backup[N][N];
int dx[5]={-1, 0, 1, 0, 0}, dy[5]={0, 1, 0, -1, 0};void turn(int x, int y) //变状态
{for (int i = 0; i < 5; i ++){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= 5 || b < 0 || b>= 5)   continue; //越界 忽略 e[a][b] ^= 1;  //不同为1 相同为0 }
}int main()
{int t;cin >> t;while(t --){for (int i = 0; i < 5; i ++)cin >> e[i];int res = 10;for (int op = 0; op < 32; op ++) //第一行的灯可以有2^5种开关法 去递归所有的按法  {memcpy(backup, e, sizeof e); //原数据备份 然后操作e 每进行完一次开关的按法之后再还原回去 再操作int step = 0;for (int i = 0;i < 5; i ++)//与运算 同时为1 结果才为1 if (op >> i & 1) //二进制下第i位为1表示按了第一行的第i个位置灯的开关  {step ++;turn(0, i); //因为我们按了这个位置 所以我们要去它附近的灯变化一下 } //第一行按完之后 再根据按完后的数据 去从头开始检查 for (int i = 0; i < 4 ;i++) for (int j = 0; j < 5; j++)if (e[i][j] == '0') //当前行灯i j是暗的时候 以这个灯的下一行i j+1去改变灯 {step++;turn(i + 1, j);}bool close = false;// 因为我们前面已经把前四行灯暗的 都调亮了 //所以最后判断的时候只需要看最后一行的灯是否全是亮的就行了 for (int i = 0; i < 5; i ++) if (e[4][i] == '0')close = true;if (!close) res = min(res, step);memcpy(e, backup, sizeof e);}if (res > 6)res = -1;cout << res << endl;}return 0;
}

AcWing 95. 费解的开关 (递归位运算 详解)相关推荐

  1. AcWing 95. 费解的开关 Python详解

    一.算法思想--递推(详细证明见算法竞赛进阶指南原书) 1)若固定第1行,则方案至多只有1种 2)把第1行的所有情况遍历,先把亮着的灯全部关闭 3)遍历前4行,如果灯是关着的,就把下1行同1列的灯改变 ...

  2. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  3. 位运算详解+竞赛常见用法总结

    目录 一.位运算详解 二.位运算应用 1.快速幂 2.给定一个数组A, 长度为n,求下面这段程序的值 3.数数字 4.数数字 2 5.nim博弈问题: 6.树状数组 7.判断一个数x是不是2的某次方 ...

  4. php的位运算,php的位运算详解

    php的运算符有一类是位运算的,本文主要和大家分享php的位运算详解,希望能帮助到大家. 一:& And按位与 $a&$b 将把二进制$a和二进制$b位数都为1的设为1,其他位为0 例 ...

  5. 一篇搞定位运算——java位运算详解

    java位运算详解 前言 一.位运算符 &:按位与 |:按位或 ~:按位非 ^:按位异或 <<:左位移运算符 >>:右位移运算符 <<<:无符号右移运 ...

  6. AcWing 95. 费解的开关(指数型枚举)

    95. 费解的开关 题意: 给定一个5x5的方格,共25盏灯 每盏灯有开和关两种状态 每次操作一盏灯时,以该灯为中心的十字形状范围的灯都会改变状态 找到用最少的操作步数使所有的灯都亮着,当步数超过6时 ...

  7. 费解的开关(位运算+递推)

    题目描述: 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁 ...

  8. C++位运算详解(转)

    位运算是对表示数据的基本单元进行"加和","减除"的方法. 首先一个位(bit)单位就是0或1,硬件表示就是一个肪冲的开和,这是硬软通迅最基本的单元.我们所说的 ...

  9. Java 位运算详解

    目录 一.Java中支持的位运算 二.位运算规则 三.逻辑运算 (一).与运算(&) 一.运算规则 二.运算流程 (二).或运算(|) 一.运算规则 二.运算流程 (三).异或运算(^) 一. ...

  10. 灰度图像压缩 DP算法 位运算详解

    作者码字不易,白天敲代码,晚上熬夜赶报告,要转载请注明出处哦,程序猿的辛酸泪 目录 位运算回顾 压缩过程 解压过程 关于一个莫得感情的小bug 实用小工具的下载地址 完整版代码 位运算回顾 若 a = ...

最新文章

  1. 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用
  2. 《为什么在多核处理器下需要内存屏障(MenmoryBarrier)?》
  3. Linq to SQL Like Operator(转)
  4. 数据结构 线性存储 -- 栈 讲解
  5. 求两个数集的并集C++代码实现
  6. [react] 在React中组件的props改变时更新组件的有哪些方法?
  7. 探索MicroPython(一)--基础介绍
  8. 在3D模型上选择顶点
  9. java浮点运算很难_关于Java:浮点运算不能产生精确结果
  10. springboot + vue开发环境搭建
  11. 嵌入式学习笔记-迅为4412开发板实现一键开关机休眠唤醒
  12. 最完整的Android 安卓开发体系了解一下
  13. web 视频演示,MP4小视频免费下载
  14. TCP 的四次挥手,可以变成三次挥手吗?
  15. Android App 导出APK安装包以及制作App图标讲解及实战(图文解释 简单易懂)
  16. 五面阿里拿下飞猪事业部offer,先睹为快
  17. RMAN 系列(九) ---- 调整RMAN备份与恢复操作的性能
  18. CANopen2.0-SYNC
  19. 【学习笔记】SpringMVC—@RequestMapping注解
  20. 年轻人必备的几个资源订阅号

热门文章

  1. 你真的了解什么是冒烟测试么?
  2. vue v-modle实现组件之间的动态传值
  3. word中的神奇的“Alt + X”
  4. PHP利用ImageMagick实现PDF、PPT转图片
  5. 亚马逊服务器怎么修改登录密码,将亚马逊aws的ec2服务器的登陆方式改为密码登陆...
  6. 【重识云原生】第六章容器基础6.4.10.3节——StatefulSet实操案例-部署WordPress 和 MySQL
  7. vs打开别人cpp_和女朋友定了间主题酒店,结果打开门后崩溃了...哈哈哈哈哈照片xswl!...
  8. 探寻机器人创客教育中的趣味
  9. 立创EDA——PCB的布局(四)
  10. SimpleMind Pro 1.29.1 小巧的思维导图工具