费解的开关

时间限制: 1 Sec  内存限制: 128 MB
                                                                                提交: 105  解决: 39
                                                                [提交] [状态] [讨论版] [命题人:admin]

题目描述

你玩过“拉灯”游戏吗?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个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。
对于30%的数据,n<=5;
对于100%的数据,n<=500。

输出

输出数据一共有n行,每行有一个小于等于6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。
对于某一个游戏初始状态,若6步以内无法使所有灯变亮,请输出“-1”。

样例输入

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

样例输出

3
2
-1

[提交]    [状态]

题意

给出n个5×5的开关,按下一个开关会影响周围4个灯和自己(开变成关,关变成开)。求最少需要按多少次开关才能使得全部灯变亮?(6次以上则视为无法点亮)。

题解

首先我们要枚举第一行灯开关的所有情况,那么如果要改变第一行的灯的状态,那么就只能更改第二行的位于该灯下面的那个开关来改变

如果我们固定了第一行,那么为了将全部都变成绿色,就必须利用第二行。例如,(1,1)(1,1)是红色,为了让它变成绿色,就必须更改(2,1)(2,1)。为了让(1,4)(1,4)变成绿色,就必须更改(2,4)(2,4)。
更改后图形如下:

那么我们再固定第二行,利用第三行来更改它(就像用第一行来更改第二行一样),就变成了

同理,更改第三行

再更改第四行

这是我们发现,最后还有一个灯是关着的,所以,这说明第一行的灯如果是这样的情况就无法成立
那么就继续枚举第一行的点击方式,再继续按照刚才的方法,判断能否点完即可。

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#define Inf 0x3f3f3f
#define ll long long
using namespace std;
int t;
int ans;
int a[10][10];
int b[10][10];
int check(int cnt)//判断第一行的条件是否成立
{int sum=cnt;for(int i=1;i<=5;i++)for(int j=1;j<=5;j++)b[i][j]=a[i][j];for(int i=1;i<=4;i++){for(int j=1;j<=5;j++){if(!b[i][j]){sum++;b[i][j]=!b[i][j];b[i+1][j]=!b[i+1][j];b[i+1][j-1]=!b[i+1][j-1];b[i+1][j+1]=!b[i+1][j+1];b[i+2][j]=!b[i+2][j];}}}for(int i=1;i<=5;i++)if(!b[5][i])return Inf;return sum;}
int dfs(int cnt,int k)
{if(cnt>5){ans=min(ans,check(k));return 0;}a[1][cnt]=!a[1][cnt];a[1][cnt-1]=!a[1][cnt-1];a[1][cnt+1]=!a[1][cnt+1];a[2][cnt]=!a[2][cnt];dfs(cnt+1,k+1);//按下这个开关a[1][cnt]=!a[1][cnt];a[1][cnt-1]=!a[1][cnt-1];a[1][cnt+1]=!a[1][cnt+1];a[2][cnt]=!a[2][cnt];dfs(cnt+1,k);//不按下这个开关
}
int main()
{scanf("%d",&t);while(t--){for(int i=1;i<=5;i++)for(int j=1;j<=5;j++)scanf("%1d",&a[i][j]);ans=Inf;dfs(1,0);if(ans<7)printf("%d\n",ans);else printf("-1\n");}return 0;
}

费解的开关(模拟/BFS+二进制)相关推荐

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

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

  2. poj1426_模拟BFS

    题意:给出一个200以内的数n,求出这个数的倍数M,使得M中只有0和1组成.M最多100位. 分析:这个题竟然用的是bfs的思想.不看讨论真的想不出来.思路是这样的: 1.最高位一定是1.curnum ...

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

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

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

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

  5. csu 1536 Bit String Reordering(模拟 bfs+状态压缩)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 题意: 输入n个只为 0或1 的数 形成一个排列 再输入m个数 每个数代表 目标排列 (样例 ...

  6. HDU 5025Saving Tang Monk BFS + 二进制枚举状态

    3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...

  7. 【CodeForces - 1066A~E】水题,模拟(有技巧),思维,题意难懂的模拟,二进制问题(有技巧)

    A. 题目大意: x坐标上1~L有L个点都是整数,每v个长度就有一个灯亮着,但是有 [ l , r ] 这段区间上有列火车挡住了,问你能看到多少亮灯. 解题报告: 大水题啊,找几个样例就会发现需要特殊 ...

  8. Acwing:费解的开关

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

  9. 题解【acwing】95 费解的开关

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

  10. 拯救公主 计蒜客 BFS+二进制状压

    Problem Description 多灾多难的公主又被大魔王抓走啦!国王派遣了第一勇士蒜头君去拯救她.身为超级厉害的术士,同时也是蒜头君的好伙伴,你决定祝他一臂之力.你为蒜头君提供了一张大魔王根据 ...

最新文章

  1. Win10系统如何在防火墙里开放端口
  2. 一文理解CatBoost!
  3. docker可视化管理工具对比 DockerUI Shipyard Rancher Portainer
  4. 望岳物业APP开发过程
  5. 免费的FTP linux 服务器中文,linux ftp服务器的搭建和中文字体乱码的解决
  6. match_phrase搜不出来,怎么办?
  7. KNN针对中文文本分类
  8. [转载]MATLAB movie 函数动态绘图
  9. 暑假周总结二7.22
  10. React-组件通信
  11. c语言二维数组每行最小值,编写一个函数,用于计算具有n行和m列的二维数组中指定列的平均值以及数组各行的和的最小值。...
  12. 复旦 | DialogVED:用于对话响应生成的预训练隐变量编码-解码模型
  13. RINEX 3.04
  14. 犹太民族与基督的真相!
  15. 公司倒闭 1 年了,而我当年的项目上了 GitHub 热榜
  16. win7“您可能没有权限使用网络资源”的解决办法
  17. WiFi万能钥匙+小米手机拿到coffee店WiFi密码
  18. connect() to unix:/home/tmp/myproject.sock failed (2: No such file or directory)
  19. BLAST原理和用法总结(二)
  20. Java 给PDF文件添加水印

热门文章

  1. 【2019年01月18日】股息率分红最高排名
  2. allegro中怎样制作和添加logo
  3. 使用手机模拟NFC加密门禁卡
  4. python中group是啥_python中group和groups函数的区别
  5. Redis imgrate迁移键 (error) ERR Target instance replied with error: NOAUTH Authentication required.
  6. 丁火生于未月命理分析_日主丁、未月出生五行喜用分析-丁日未月生《晶灵八字算命》...
  7. JAVA后端工程师笔试题-避坑公司
  8. 微信企业号开发:openapi回调地址请求不通过
  9. Scanner类、Random类、ArrayList 类
  10. Java第五章 常用API