95. 费解的开关 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/description/97/
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
#include <cstdlib>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 2000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
int n;
char now[10][10], last[10][10];
int go[5][2] = {{0, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, 0}};
inline void solve(int x, int y) {
int tx, ty;
for (int i = 0; i < 5; i++) {
tx = x + go[i][0];
ty = y + go[i][1];
if (tx < 0 || tx > 4 || ty < 0 || ty > 4) {
continue;
}
if (now[tx][ty] == '0') {
now[tx][ty] = '1';
} else {
now[tx][ty] = '0';
}
}
}
int main() {
scanf("%d", &n);
while (n--) {
int ans = INF;
for (int i = 0; i <= 4; i++) {
cin>>last[i];
}
for (int cas = 0; cas < 32; cas++) {
int step = 0;
memcpy(now, last, sizeof(last));
for (int i = 0; i < 5; i++) {
if (cas >> i & 1) {
solve(0, i);
step++;
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j <= 4; j++) {
if (now[i][j] == '0') {
solve(i + 1, j);
step++;
}
}
}
bool flag = true;
for (int i = 0; i <= 4; i++) {
if (now[4][i] == '0') {
flag = false;
break;
}
}
if (flag) {
ans = min(ans, step);
}
}
if (ans >6) {
printf("-1\n");
} else {
printf("%d\n", ans);
}
}
return 0;
}