解题思路:每一行每一个开关是否需要操作完全由上一行灯的亮灭状态所决定。
所以用二进制枚举第一行开关的操作情况。
第一行灯的亮灭状态确定后,整个5*5所有灯的亮灭状态就确定了。
因为最后一行没有下一行了,所以判断最后一行是否全为亮,若不全为亮就是不合题意。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 6; 4 char g[N][N], bk[N][N]; 5 int dx[5] = {-1, 0, 1, 0, 0}; 6 int dy[5] = {0, 1, 0, -1, 0}; 7 void turn(int x, int y) { 8 for (int i = 0; i < 5; i++) { 9 int a = x + dx[i]; 10 int b = y + dy[i]; 11 if (a < 0 || a >= 5 || b < 0 || b >= 5) { 12 continue; 13 } 14 g[a][b] ^= 1; 15 } 16 } 17 int main() { 18 int T; 19 cin >> T; 20 while (T--) { 21 for (int i = 0; i < 5; i++) { 22 cin >> g[i]; 23 } 24 int res = 10; 25 for (int op = 0; op < 32; op++) { 26 memcpy(bk, g, sizeof g); 27 int step = 0; 28 for (int i = 0; i < 5; i++) { 29 if (op >> i & 1) { 30 step++; 31 turn(0, i); 32 } 33 } 34 for (int i = 0; i < 4; i++) { 35 for (int j = 0; j < 5; j++) { 36 if (g[i][j] == '0') { 37 step++; 38 turn(i + 1, j); 39 } 40 } 41 } 42 bool flag = false; 43 for (int i = 0; i < 5; i++) { 44 if (g[4][i] == '0') { 45 flag = true; 46 break; 47 } 48 } 49 if (!flag) { 50 res = min(res, step); 51 } 52 memcpy(g, bk, sizeof bk); 53 } 54 if (res > 6) { 55 res = -1; 56 } 57 cout << res << endl; 58 } 59 return 0; 60 }