#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
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; // 在边界外,直接忽略即可
g[a][b] ^= 1;//改变状态
}
}
int main()
{
int T;
cin >> T;
while (T -- )
{
//读入初始矩阵
for (int i = 0; i < 5; i ++ ) cin >> g[i];
int res = 10;
for (int op = 0; op < 32; op ++ )//2^5,代表第一行五个位置,每个位置有两种情况,把第一行的每种情况都列出来,然后根据第一行的状态去推下面四行的情况
{
memcpy(backup, g, sizeof g);//备份
int step = 0;//记录步骤
for (int i = 0; i < 5; i ++ )
if (op >> i & 1)//如果这个位置是1,代表需要摁(跟这个位置的灯亮/灭无关,只是为了把第一行所有可能的情况都列出来
{
step ++ ;//摁一下
turn(0, i);
}
//将第一行全部处理为0
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 dark = false;
for (int i = 0; i < 5; i ++ )
if (g[4][i] == '0')
{
dark = true;
break;
}
if (!dark) res = min(res, step);
memcpy(g, backup, sizeof g);
}
if (res > 6) res = -1;
cout << res << endl;
}
return 0;
}
AcWing 95 费解的开关 题解(递归 蓝桥杯)
于 2022-03-11 00:27:42 首次发布