题目描述

点击进入题目

你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。

我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。下面这种状态

10111
01101
10111
10000
11011

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

01111
11101
10111
10000
11011

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

01111
11001
11001
10100
11011

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

思路

这是一道递推题,《最强大脑》中也出现过类似游戏,因为第一行一旦确定了,其他各行的就确定了,所以我们可以先枚举出第一行的状态,再推导出其他行的按法,最后判断是否符合全’1’的要求,那么就分四部分:

  1. 用二进制枚举出第一行所有按灯的组合(例如11111代表全都要按,00000代表一个都不按)
  2. 如果上一行灯是’0’则下一行这个位置需要按一下
  3. 依次检查最后一行每个灯是不是都是’1’,是则更新按的次数的最小值
  4. 如果最后结果中按的次数的最小值大于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 费解的开关相关推荐

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

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

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

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

  3. AcWing 95. 费解的开关

    原题链接:https://www.acwing.com/problem/content/97/ 看了前几篇题解和y总的视频讲解,总有一个奇怪的点搞不明白,为什么说第一行确定了,第二行就确定了,第三行接 ...

  4. 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推

    文章目录 题目解答 题目来源 题目解答 分析: 枚举第一行,指的是第一行哪些位置要切换状态!!!.第一行总共有5个数,组合数是32,即第一行哪些位置要切换总共有32种情况.这就是我们的枚举空间.比如, ...

  5. Acwing:费解的开关

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

  6. 95. 费解的开关【二级制枚举】

    二进制枚举第一行的操作状态. #include<bits/stdc++.h> using namespace std; const int N=30; char a[N][N],b[N][ ...

  7. 【结论】【dfs】费解的开关(joyoi-tyvj 1266)

    费解的开关 joyoi-tyvj 1266 题目大意: 有5*5的一个图,每个点的数值是1或0,如果将一个点的数值取反,那这个点上下左右的点都会取反,现在问你将所有点都变为1最少要多少步,如果步数大于 ...

  8. ACW95 费解的开关

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

  9. Vijos 1197 - 费解的开关

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

最新文章

  1. Markdown 语法说明 (简体中文版)
  2. java myeclipse The type java.lang.CharSequence cannot be resolved. It is indirectly referen
  3. AlphaGo背后的力量:蒙特卡洛树搜索入门指南
  4. oracle数据库有几个服务_oracle数据库可以有几个数据库
  5. 栈溢出笔记1.6 地址问题(1)
  6. 桥接模式(Bridge)解析例子
  7. 【Linux】关于Linux操作系统的基本操作
  8. MATLAB拉格朗日插值公式代码
  9. 计算机等级考试四级网络工程师真题,计算机等级考试四级网络工程师试题
  10. 管家婆财贸双全ⅡTOP 期间202012的损益类科目本币(外币或者数量)余额不为零,不能年结存。
  11. searchEngin_设置bing国际版为默认引擎
  12. 程序的时间和空间复杂度
  13. 09年河南高考零分作文:兔子,你就是一个傻B
  14. acm第一周学习总结
  15. 阿里云服务器被攻击10g怎么进黑洞了?
  16. Bootstrap的iCheck插件checkbox和radio
  17. IT男未来发展之路——迷茫了就看看
  18. Matlab工业检测之尘埃统计
  19. 新手从0-1的淘宝客创业之路 新手淘客必读
  20. 深度解剖HashMap底层原理

热门文章

  1. python中bytearray函数_Python内置函数(13)——bytearray
  2. 预测1亿人次!3月底将迎来学生返校流
  3. 揭露动画_揭露:为什么今天建立电子邮件列表如此重要(6个原因)
  4. JAVA开发神器-反编译工具:jadx
  5. 使用dlib实现的简单疲劳检测程序
  6. Java小白StudyDay09---代码块、final、多态、异常
  7. stringtokenizer java_基于Java中的StringTokenizer类详解(推荐)
  8. APPUI 自动化测试-----常见面试题汇总
  9. 宝讯网捷电商:拼多多两单免单是怎么免的?
  10. 王者服务器维护什么时间结束s20,王者荣耀s20赛季还有多久结束?s20赛季结束时间介绍[多图]...