描述

你玩过“拉灯”游戏吗?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”。
样例1

样例输入1

3
00111
01011
10001
11010
11100

11101
11101
11110
11111
11111

01111
11111
11111
11111
11111
Copy
样例输出1

3
2
-1
Copy
限制

各个测试点1s
来源

Matrix67原创
.
.
.
.
.

分析

在这里,我们可以发现,每个位置也就点击一次,而且,固定第一行后,最多只有一种可行方案。由此,我们可以枚举第一行的32种情况,之后通过递推,找到最终状态,递推结束,只需检验最后一行是否合法即可。
.
.
.
.
.

程序:
#include<iostream>
#include<string.h>
using namespace std;
int a[5][5],b[5][5];
char str[6];void change(int x,int y)
{b[x][y]^=1;if (x>0) b[x-1][y]^=1;if (x+1<5) b[x+1][y]^=1;if (y>0) b[x][y-1]^=1;if (y+1<5) b[x][y+1]^=1;
}int work(int f1)
{int i,j,r=0;for (j=0;j<5;j++){if (f1&(1<<j)){r++;change(0,j);}}for (i=1;i<5;i++){for (j=0;j<5;j++){if (b[i-1][j]==0){if (++r>=7){return 7;}change(i,j);}}}for (j=0;j<5;j++){if (b[4][j]==0){return 7;}}return r;
}int main()
{int n;cin>>n;for (int w=1;w<=n;w++){int step=99999;for (int i=0;i<5;i++){cin>>str;for (int j=0;j<5;j++)a[i][j]=str[j]-'0';}int j;for (int i=0;i<32;i++){memcpy(b,a,sizeof(b));j=work(i);if (j<step) step=j;}if (step<7) cout<<step<<endl;else cout<<-1<<endl;}return 0;
}

转载于:https://www.cnblogs.com/YYC-0304/p/9499913.html

Vijos 1197 - 费解的开关相关推荐

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

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

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

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

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

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

  4. ACW95 费解的开关

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

  5. Acwing:费解的开关

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

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

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

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

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

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

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

  9. 【DFS】费解的开关

    L i n k Link Link Joyoi 1266 D e s c r i p t i o n Description Description 你玩过"拉灯"游戏吗?25盏灯 ...

最新文章

  1. javascript组件_是的,JavaScript运行Swift。 无论如何都要构建您的组件库。
  2. php文章列表样式,css列表样式有哪些?css设置列表样式的方法
  3. 记录一下CUDA-opencv联合编程
  4. 上海公布公交卡成本 押金拟从30元调至20元
  5. 【深度学习】基础知识 | 超详细逐步图解 Transformer
  6. CSS3 -webkit-transform(元素变换)
  7. C#重写ToString
  8. libuv tcp client
  9. 你以为写小说就只有一种签约方式?
  10. 测试2年,薪资翻倍的面试养成系 I 小蘑菇的大厂的进击之路
  11. buf.indexOf()
  12. 从Model1,Medel2到显示层框架的出现
  13. HenCoder 3-1 触摸反馈,以及 HenCoder Plus
  14. 【网络安全】OSSIM平台网络日志关联分析实战
  15. hazy的leetcode刷题笔记(三)
  16. Rust 有问有答之 crate 是什么
  17. 宜家IKEA EDIFACT PRODAT报文详解
  18. 捏脸是如何实现的?程序化生成3D头像
  19. 一文读懂pid控制器
  20. 零基础如何学素描——什么是结构素描…

热门文章

  1. 科大星云诗社动态20210815
  2. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170326
  3. 超详细的 Bert 文本分类源码解读 | 附源码
  4. opencl获取gpu信息_如果在尝试获取OpenCL gpu设备类型时,Char *语句出现问题
  5. python获得用户输入的一个字符串(长度3)_python3 字符串属性(一)
  6. openCV滑动条TrackBar事件实例
  7. VTK修炼之道83:Pipeline管线执行模型
  8. c#中一个简单的深拷贝方法
  9. jupyter notebook即原来的Ipython notebook的使用方法
  10. 计算机组成原理知识查漏补缺