题目描述
输入格式
输出格式
数据范围
输入样例
输出样例
思路
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int N = 6;
char g[N][N],backup[N][N];
//用来代表上下左右和自身位置
int dx[5] = {-1, 0, 1, 0, 0}, dy[5] = {0, 1, 0, -1, 0};
//改变灯的状态
void turn(int x, int y)
{
for (int i = 0; i < 5; i ++ )
{
int a = x + dx[i], b = y + dy[i];
//如果超过边界则直接跳过
if (a < 0 || a >= 5 || b < 0 || b >= 5) continue;
//'0'和'1'互换
g[a][b] ^= 1;
}
}
int main()
{
int T;
cin >> T;
while(T--)
{
int res = 10;
for(int i = 0;i < 5;i++)
{
cin >> g[i];
}
memcpy(backup,g,sizeof(g));
//遍历第一行所有的情况
//这里使用0~31表示第一行的所有状态,使用二进制表示,如果是1则表示对该位置进行操作,如果是0则代表不操作
for(int op = 0;op < 32;op++)
{
int step = 0;
for(int i = 0;i < 5;i++)
{
//为1
if(op >> i & 1)
{
step++;
turn(0,i);
}
}
//遍历前四行,获取改变后的整个矩阵的状态
for(int i = 0;i < 4;i++)
{
for(int j = 0;j < 5;j++)
{
//如果在本行中是暗,则下一行同列处需要进行一次操作
if(g[i][j] == '0')
{
step++;
turn(i+1,j);
}
}
}
//代表最后一行全部都亮
bool flag = true;
//用来查看最后一行是否全部都为亮
for(int i = 0;i < 5;i++)
{
if(g[4][i] == '0')
{
flag = false;
break;
}
}
if(flag)
{
res = min(res,step);
}
memcpy(g,backup,sizeof(g));
}
if(res > 6) res = -1;
cout << res << endl;
}
return 0;
}