AcWing 95. 费解的开关
原题链接
中等
作者:
scl
,
2020-02-15 22:54:23
,
所有人可见
,
阅读 2
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int dx[5] = {0, 0, 1, 0, -1}, dy[5] = {0, 1, 0, -1, 0};
const int maxn = 6;
char g[maxn][maxn], backup[maxn][maxn];
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 n;
cin >> n;
while(n--)
{
for(int i = 0; i < 5; i++) cin >> g[i];
int step = 10;
for(int i = 0; i < 32; i++)
{
int res = 0;
memcpy(backup, g, sizeof g);
for(int j = 0; j < 5; j++)
if(i >> j & 1)
{
res++;
turn(0, 4 - j);
}
for(int i = 0; i < 4; i++)
for(int j = 0; j < 5; j++)
if(g[i][j] == '0')
{
res++;
turn(i + 1, j);
}
bool dark = false;
for(int i = 0; i < 5; i++)
if(g[4][i] == '0') {dark = true; break;}
if(!dark) step = min(step, res);
memcpy(g, backup, sizeof g);
}
if(step > 6) step = -1;
cout << step << endl;
}
return 0;
}