题解【acwing】95 费解的开关
题目描述
点击进入题目
你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。下面这种状态
10111
01101
10111
10000
11011
在改变了最左上角的灯的状态后将变成:
01111
11101
10111
10000
11011
再改变它正中间的灯后状态将变成:
01111
11001
11001
10100
11011
给定一些游戏的初始状态,编写程序判断游戏者是否可能在6步以内使所有的灯都变亮。
思路
这是一道递推题,《最强大脑》中也出现过类似游戏,因为第一行一旦确定了,其他各行的就确定了,所以我们可以先枚举出第一行的状态,再推导出其他行的按法,最后判断是否符合全’1’的要求,那么就分四部分:
- 用二进制枚举出第一行所有按灯的组合(例如11111代表全都要按,00000代表一个都不按)
- 如果上一行灯是’0’则下一行这个位置需要按一下
- 依次检查最后一行每个灯是不是都是’1’,是则更新按的次数的最小值
- 如果最后结果中按的次数的最小值大于6步,则输出-1,否则输出答案
时间复杂度
500 × 32 × ( 25 × 5 + 5 ) = 2080000 500 \times 32 \times ( 25 \times 5+5)=2 080 000 500×32×(25×5+5)=2080000
代码
#include <iostream>
#include <cstring>
using namespace std;
const int INF=1e7;char g[10][10];
int dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1};int turn(int x,int y)
{for(int i=0; i<5; i++){int tx=x+dx[i],ty=y+dy[i];if(tx>=0 && tx<5 && ty>=0 && ty<5)g[tx][ty]^=1;//'0'的acsii码值是48,48^1=49,即'1'。'1'的acsii码值是49,49^1=48,即'0'。}
}int work()
{int ans=INF;for(int k=0; k<(1<<5); k++){int cnt=0;char backup[10][10];memcpy(backup,g,sizeof(g));//先备份一下g数组,因为每次方案尝试后要恢复原状for(int i=0; i<5; i++) {if(k>>i&1){turn(0,i);cnt++;}}for(int i=0; i<4; i++){for(int j=0; j<5; j++){if(g[i][j]=='0'){turn(i+1,j);cnt++;}}}bool is_ok=true;for(int i=0; i<5; i++){if(g[4][i]=='0'){is_ok=false;break;}}if(is_ok==true)ans=min(ans,cnt); memcpy(g,backup,sizeof(g));//注意每次改完了还要再拷贝回去}if(ans>6)ans=-1;return ans;
}int main()
{int t;cin>>t;while(t--){for(int i=0; i<5; i++)cin>>g[i];cout<<work()<< endl;}
}
题解【acwing】95 费解的开关相关推荐
- AcWing 95. 费解的开关 Python详解
一.算法思想--递推(详细证明见算法竞赛进阶指南原书) 1)若固定第1行,则方案至多只有1种 2)把第1行的所有情况遍历,先把亮着的灯全部关闭 3)遍历前4行,如果灯是关着的,就把下1行同1列的灯改变 ...
- AcWing 95. 费解的开关(指数型枚举)
95. 费解的开关 题意: 给定一个5x5的方格,共25盏灯 每盏灯有开和关两种状态 每次操作一盏灯时,以该灯为中心的十字形状范围的灯都会改变状态 找到用最少的操作步数使所有的灯都亮着,当步数超过6时 ...
- AcWing 95. 费解的开关
原题链接:https://www.acwing.com/problem/content/97/ 看了前几篇题解和y总的视频讲解,总有一个奇怪的点搞不明白,为什么说第一行确定了,第二行就确定了,第三行接 ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
文章目录 题目解答 题目来源 题目解答 分析: 枚举第一行,指的是第一行哪些位置要切换状态!!!.第一行总共有5个数,组合数是32,即第一行哪些位置要切换总共有32种情况.这就是我们的枚举空间.比如, ...
- Acwing:费解的开关
题目描述 你玩过"拉灯"游戏吗? 25 盏灯排成一个 5×5 的方形. 每一个灯都有一个开关,游戏者可以改变它的状态. 每一步,游戏者可以改变某一个灯的状态. 游戏者改变一个灯的状 ...
- 95. 费解的开关【二级制枚举】
二进制枚举第一行的操作状态. #include<bits/stdc++.h> using namespace std; const int N=30; char a[N][N],b[N][ ...
- 【结论】【dfs】费解的开关(joyoi-tyvj 1266)
费解的开关 joyoi-tyvj 1266 题目大意: 有5*5的一个图,每个点的数值是1或0,如果将一个点的数值取反,那这个点上下左右的点都会取反,现在问你将所有点都变为1最少要多少步,如果步数大于 ...
- ACW95 费解的开关
原题链接 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反 ...
- Vijos 1197 - 费解的开关
描述 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应: ...
最新文章
- Markdown 语法说明 (简体中文版)
- java myeclipse The type java.lang.CharSequence cannot be resolved. It is indirectly referen
- AlphaGo背后的力量:蒙特卡洛树搜索入门指南
- oracle数据库有几个服务_oracle数据库可以有几个数据库
- 栈溢出笔记1.6 地址问题(1)
- 桥接模式(Bridge)解析例子
- 【Linux】关于Linux操作系统的基本操作
- MATLAB拉格朗日插值公式代码
- 计算机等级考试四级网络工程师真题,计算机等级考试四级网络工程师试题
- 管家婆财贸双全ⅡTOP 期间202012的损益类科目本币(外币或者数量)余额不为零,不能年结存。
- searchEngin_设置bing国际版为默认引擎
- 程序的时间和空间复杂度
- 09年河南高考零分作文:兔子,你就是一个傻B
- acm第一周学习总结
- 阿里云服务器被攻击10g怎么进黑洞了?
- Bootstrap的iCheck插件checkbox和radio
- IT男未来发展之路——迷茫了就看看
- Matlab工业检测之尘埃统计
- 新手从0-1的淘宝客创业之路 新手淘客必读
- 深度解剖HashMap底层原理
热门文章
- python中bytearray函数_Python内置函数(13)——bytearray
- 预测1亿人次!3月底将迎来学生返校流
- 揭露动画_揭露:为什么今天建立电子邮件列表如此重要(6个原因)
- JAVA开发神器-反编译工具:jadx
- 使用dlib实现的简单疲劳检测程序
- Java小白StudyDay09---代码块、final、多态、异常
- stringtokenizer java_基于Java中的StringTokenizer类详解(推荐)
- APPUI 自动化测试-----常见面试题汇总
- 宝讯网捷电商:拼多多两单免单是怎么免的?
- 王者服务器维护什么时间结束s20,王者荣耀s20赛季还有多久结束?s20赛季结束时间介绍[多图]...