tyvj1266 费解的开关

描述

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

输入


00111 
01011 
10001 
11010 
11100

11101 
11101 
11110 
11111 
11111

01111 
11111 
11111 
11111 
11111

输出



-1

思路:

枚举第一行的按灯方案,剩下的行需要刚好灭掉上一行没有灭掉的灯,最后再判断最后一行是否灯全部灭完

代码:

#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std; 

typedef int array[6];
array a,b[6],c[6];
int n,ans;
void Init()
{
char str[6];
for (int i=1;i<=5;i++)
{
scanf("%s",str);
for (int j=1;j<=5;j++)
b[i][j]=str[j-1]-‘0‘;
}
}
int work()
{
int dep=0;
for (int i=1;i<=5;i++)
if (a[i]==1)
{
dep++;
c[1][i]^=1; c[2][i]^=1;
if (i>1) c[1][i-1]^=1;
if (i<5) c[1][i+1]^=1;
}
for (int i=2;i<=5;i++)
for (int j=1;j<=5;j++)
if (c[i-1][j]==0 && dep<=6)
{
dep++;
c[i][j]^=1; c[i-1][j]^=1;
if (j>1) c[i][j-1]^=1;
if (j<5) c[i][j+1]^=1;
if (i<5) c[i+1][j]^=1;
}
if (dep>=7) return 7;
for (int i=1;i<=5;i++)
if (c[5][i]==0) return 7;
return dep;
}
void solve()
{
Init();
ans=0xFFFFFFF;
for (int a1=0;a1<=1;a1++)
for (int a2=0;a2<=1;a2++)
for (int a3=0;a3<=1;a3++)
for (int a4=0;a4<=1;a4++)
for (int a5=0;a5<=1;a5++)
{
memcpy(c,b,sizeof(c));
a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; a[5]=a5;
int step=work();
if (step<ans) ans=step;
if (ans==2)
{
printf("2\n");
return ;
}
}
if (ans<=6) printf("%d\n",ans);
else printf("-1\n");
}
int main()
{
scanf("%d",&n);
for (int test=1;test<=n;test++) solve();
return 0;
}
时间: 2024-10-14 11:48:21

tyvj1266 费解的开关的相关文章

TyvjP1266 费解的开关

P1266 费解的开关 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态. 游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态.    我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯.下面这种状态 1011101101101111000011011 在改变了最左上角的灯的状态后将

# 费解的开关(二进制+递推+思维)

费解的开关(二进制+递推+思维) 题意:5*5的灯阵,每次按一盏灯的开关,并且这盏灯的上下左右也受到相同的影响(0->1,1->0),求使给定灯阵全1的最少步数. 题解: 每盏灯最多点击一次,点击两次相当于没有点击. 最重要的性质:如果我们确定了第1行的灯的情况的话,那么后面的行数都可以依此递推,当前行灭的灯只能由下一行同一列的灯使之点亮. 附上一个写的较好的题解 举个例子 11011 10110 01111 11111 第一行中第三盏灯为0,那么必须通过第二行的第3张灯将其点亮,当前行的灯只

AcWing 95 费解的开关

目录 前言 题目链接 思路 代码 前言 博客咕咕咕了好久了,是时候写一下了 题目链接 AcWing 95 费解的开关 思路 首先可以看出 1.每一个位置顶多只会操作一次.因为如果操作两次的话,相当于不操作,必然是不满足最优解 2.在一套方案中,操作的顺序无关紧要. 3.如果我们确定了第I行的操作方案的话,那么后面的行数都可以依此递推,下面给出一个详细的解答. 11011 10110 01111 11111 比如说这个例子,如果我们确定了第1行,那么第二行所有的0(坐标:a[i][j]) 都只能是

费解的开关 switches

[题目描述]: 你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态. 我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯.下面这种状态 10111 01101 10111 10000 11011 在改变了最左上角的灯的状态后将变成: 01111 11101 10111 10000 11011 再改变它正中间的灯后状态将变成

费解的开关

题目描述 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态. 我们用数字"1"表示一盏开着的灯,用数字"0"表示关着的灯.下面这种状态 10111 01101 10111 10000 11011 在改变了最左上角的灯的状态后将变成: 01111 11101 10111 10000

费解的开关(状压)

题目描述 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态.我们用数字"1"表示一盏开着的灯,用数字"0"表示关着的灯.下面这种状态1011101101101111000011011在改变了最左上角的灯的状态后将变成:0111111101101111000011011再改变它正中

[VIJOS1197] 费解的开关

枚举第一行的点击方案. 则点完后剩余的黑灯只能由第二行同一列的点击来弥补 并且第二行除了弥补第一行的黑灯之外,不能点其他灯,否则会使第一行的灯灭 上述构成了递推关系,则递推到最后一行即可. 二进制位运算优化:注意最后一行的状态的判断 复杂度 \(O(n2^n),n=5\). 代码 #include<cstdio> #include<algorithm> using namespace std; int n; int fl[10]; int bitcount(int x){// 统计

AcWing - 95 - 费解的开关 = bfs

https://www.acwing.com/problem/content/97/ 看了一下感觉可以暴力做,踩了一些坑终于过了. #include<bits/stdc++.h> using namespace std; typedef long long ll; int cur; int set_ij(int u, int i, int j) { int cur = u; cur ^= 1 << (i * 5 + j); if(i - 1 >= 0) cur ^= 1 &l

95. 费解的开关

#include <iostream> #include <cstring> using namespace std; const int INF = 0x3f3f3f3f; char g[10][10]; int dx[5] = {0, -1, 0, 1, 0}, dy[5] = {0, 0, 1, 0, -1}; void turn(int x, int y) { for(int i = 0; i < 5; ++ i) { int a = x + dx[i], b = y