博客
关于我
AcWing 95. 费解的开关 二进制全排列+思维
阅读量:578 次
发布时间:2019-03-09

本文共 1863 字,大约阅读时间需要 6 分钟。

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

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

1011101101101111000011011

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

0111111101101111000011011

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

0111111001110011010011011

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

输入格式

第一行输入正整数n,代表数据中共有n个待解决的游戏初始状态。

以下若干行数据分为n组,每组数据有5行,每行5个字符。每组数据描述了一个游戏的初始状态。各组数据间用一个空行分隔。

输出格式

一共输出n行数据,每行有一个小于等于6的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。

对于某一个游戏初始状态,若6步以内无法使所有灯变亮,则输出“-1”。

数据范围

0<n≤500
输入样例:

3001110101110001110101110011101111011111011111111110111111111111111111111111

输出样例:

32-1

思路

这道题确实很有难度,y总给出了一个思路,将第一行锁死,然后从第一行开始从第一行到第四行只要遇到0就改变下一行的灯,也就是说第一行的位置确定,得到的灯泡亮度图也是确定的,不亮的灯只会出现在最后一行,因为前四行都被我们改变全部都是亮的,第一行有25=32中方案,我们依次枚举这些方案,然后判断一共需要多少步并且是否可以达到目标状态,题目中说最少在6步以内并且全部都是开的。

主要思想

全排列

代码如下

#include
#include
#include
using namespace std;const int N=10;char g[N][N],bg[N][N];int dx[5]={ 0,0,0,1,-1},dy[5]={ 1,-1,0,0,0};void turn(int x,int y){ for(int i=0;i<5;i++) { int tx=x+dx[i]; int ty=y+dy[i]; if(tx>=0&&ty>=0&&tx<5&&ty<5) { bg[tx][ty]='1'-bg[tx][ty]+'0'; } }}int main(void){ int n; scanf("%d",&n); while(n--) { for(int i=0;i<5;i++) scanf("%s",g[i]); int res=10; for(int i=0;i<32;i++) { memcpy(bg,g,sizeof g); int cnt=0; for(int j=0;j<5;j++) { if(i>>j&1) turn(0,j),cnt++; } for(int j=0;j<4;j++) { for(int p=0;p<5;p++) { if(bg[j][p]=='0') turn(j+1,p),cnt++; } } bool flag=true; for(int j=0;j<5;j++) if(bg[4][j]=='0') flag=false; if(flag&&cnt

转载地址:http://phkpz.baihongyu.com/

你可能感兴趣的文章
MySQL查看表结构和表中数据
查看>>
MySQL查询优化:LIMIT 1避免全表扫描
查看>>
MySQL查询优化之索引
查看>>
mysql查询储存过程,函数,触发过程
查看>>
mysql查询总成绩的前3名学生信息
查看>>
MySQL查询报错ERROR:No query specified
查看>>
mysql查询数据库储存数据的占用容量大小
查看>>
MySQL查询数据库所有表名及其注释
查看>>
MySQL查询数据表中数据记录(包括多表查询)
查看>>
mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层执行原理吗?
查看>>
MySQL死锁套路:一次诡异的批量插入死锁问题分析
查看>>
Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction
查看>>
mysql每个数据库的最大连接数_MySQL数据库最大连接数
查看>>
Mysql流程控制结构,if函数、case结构、if结构、循环结构
查看>>
mysql添加用户
查看>>
MySQL添加用户、删除用户与授权
查看>>
mysql添加用户及权限
查看>>
Mysql添加用户并授予只能查询权限
查看>>
mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决
查看>>
mysql添加索引
查看>>