C++费解的开关(递推,位运算)
你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。下面这种状态
10111
01101
10111
10000
11011
在改变了最左上角的灯的状态后将变成:
01111
11101
10111
10000
11011
再改变它正中间的灯后状态将变成:
01111
11001
11001
10100
11011
给定一些游戏的初始状态,编写程序判断游戏者是否可能在6步以内使所有的灯都变亮。
输入格式
第一行输入正整数n,代表数据中共有n个待解决的游戏初始状态。
以下若干行数据分为n组,每组数据有5行,每行5个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。
输出格式
一共输出n行数据,每行有一个小于等于6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。
对于某一个游戏初始状态,若6步以内无法使所有灯变亮,则输出“-1”。
数据范围
0<n≤500
输入样例:
3
00111
01011
10001
11010
11100
11101
11101
11110
11111
11111
01111
11111
11111
11111
11111
输出样例:
3
2
-1
AC代码:
#include<iostream>
#include<algorithm>
#include<string.h>using namespace std;int dx[5]={1,0,-1,0,0};//坐标偏移量
int dy[5]={0,-1,0,1,0};//下,左,上,右,原点
char g[6][6];//原状态
char backup[6][6];//原状态备份void turn(int x,int y)//执行按下(x,y)处开关引发的改变
{for(int i=0;i<5;++i){int a=x+dx[i];int b=y+dy[i];if(a<0||a>=5||b<0||b>=5) continue;g[a][b]^=1;}
}int main()
{int n;cin>>n;while(n--){for(int i=0;i<5;++i) cin>>g[i];memcpy(backup,g,sizeof(g));int ans=25;for(int i=0;i<32;++i)//枚举第一行的操作{int step=0;for(int j=0;j<5;++j)//进行第一行的操作{if(i>>(4-j)&1){++step;turn(0,j);}}for(int j=0;j<4;++j)//递推之后四行的操作{for(int k=0;k<5;++k){if(g[j][k]=='0'){++step;turn(j+1,k);}}}bool dark=false;for(int j=0;j<5;++j)//判断是否达到目标{if(g[4][j]=='0'){dark=true;break;}}if(!dark) ans=min(ans,step);memcpy(g,backup,sizeof(backup));//恢复初始状态}if(ans>6) ans=-1;cout<<ans<<endl;}return 0;
}
C++费解的开关(递推,位运算)相关推荐
- 费解的开关(位运算+递推)
题目描述: 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁 ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
文章目录 题目解答 题目来源 题目解答 分析: 枚举第一行,指的是第一行哪些位置要切换状态!!!.第一行总共有5个数,组合数是32,即第一行哪些位置要切换总共有32种情况.这就是我们的枚举空间.比如, ...
- HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)
HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...
- 338 比特位计数(动态规划-递推)
1. 问题描述: 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] ...
- 累加、迭代、递推、穷举、递归 ,等运算,笔记
8.计算 8.1累加: 累加:将一系列的数据加到一个变量里面,最后得到了累加的结果. 一般形式: 累加:V+=e: 累积:V*=e: V代表累加和累积,e代表累加累积项. 算法要点: 1. 初始 ...
- 0x02.基本算法 — 递推与递归
目录 一.递推与递归 二.分治 三.模拟计算机实现递归 四.相应习题: 0.AcWing 92. 递归实现指数型枚举(递归/循环+位运算) 1.AcWing 93. 递归实现组合型枚举 2.AcWin ...
- 基本算法之递推与递归的简单应用
递推与递归的简单应用 常见的枚举形式 实现指数型枚举 DFS (一) DFS (二) 位运算(一) 位运算(二) 实现组合型枚举 DFS + 剪枝 实现排列型枚举 DFS 费解的开关 奇怪的汉诺塔 分 ...
- 蓝桥备赛第一周2021.1.11 递归 枚举 位运算
文章目录 递归实现指数型枚举 递归指数型枚举 方法1:肯定是2^n行,所以直接就是上一个动态m从0到n加一堆空行 方法2:以最新的值为n为结束,遇到为0的不输出,用完要恢复为0 递归实现排列型枚举 非 ...
- AcWing 蓝桥杯AB组辅导课 01、递归与递推
文章目录 前言 一.递归 知识点 例题 题目1:AcWing 95.斐波那契数列[简单,递归写法] 题目2:AcWing 92.递归实现指数型枚举[简单] 题目3:AcWing 94.递归实现排列型枚 ...
最新文章
- 新年新气象,祝所有朋友心想事成
- 【夸QT十一】外来物品:通用脚本帮助Web运行基础Linux命令
- 无服务器计算的黑暗面:程序移植没那么容易
- 《JavaScript高效图形编程(修订版)》——第2章 DHTML基础 2.1创建DHTML sprite
- bootstrap轮播,播放到最后一张图片的时候,就不正确了。
- flink sql client讀取kafka數據的timestamp(DDL方式)
- python命令行工具_python命令行工具Click快速掌握
- easyui combobox默认选中项
- 零火线都带电该怎么处理?
- PHP,mysql,Linux,CI框架学习总结
- 【node】node连接mongodb操作数据库
- DCEP | 农行将上线数字人民币刷脸支付
- oracle sqlcode 多条,oracle sqlerrm和sqlcode函数
- Idea一不小心把Main menu头部菜单关闭还原的解决办法
- 微信小程序不支持使用本地图片设置背景图片解决方法
- Kubernetes 报错小结
- Win10中启动或关闭Windows功能中没有SNMP服务的解决办法
- 编译原理 C-Minus词法分析(FLEX)
- spring boot 整合 云之讯 demo
- UVA 815 Flooded!(洪水!)