// 卡壳,括号处理出问题了,这里的括号把下面的部分全包住了;打代码慢一点,稳住细节,debug的时候也要检查一下括号问题(毕竟比较容易检查,可以优先检查)
// 根据操作判断是开关问题,然后影响上下左右中的开关操作的做法是枚举最开始的一行的操作,然后递推,最后验证 // 还要看输入与范围,输入没有空格,要用char,范围500,非常安全可以dp,floyd,n^3,dfs剪枝 #include <iostream> #include <cstring> #include <cstdio> #include <cstring> using namespace std; const int N = 6; char f[N][N],backup[N][N]; int dx[] = {0,0,0,1,-1},dy[] = {0,1,-1,0,0}; void turn(int x,int y){ for(int i = 0;i < 5;i++){ int a = dx[i] + x; int b = dy[i] + y; if(a < 0 || a > 4 || b < 0 || b > 4) continue; f[a][b] ^= 1; } } int main(){ int t; cin >> t; while(t--){ for(int i = 0;i < 5;i++){ for(int j = 0;j < 5;j++){ cin >> f[i][j]; } } memcpy(backup,f,sizeof f); int res = 0x3f3f3f3f; for(int op = 0;op < 1 << 5;op++){ int step = 0; for(int i = 0;i < 5;i++){ // 卡壳,括号处理出问题了,这里的括号把下面的部分全包住了; if(op >> i & 1){ turn(0,i); step++; } } for(int i = 0;i < 4;i++){ for(int j = 0;j < 5;j++){ if(f[i][j] == '0'){ turn(i+1,j); step++; } } } bool dark = false; for(int i = 0;i < 5;i++){ if(f[4][i] == '0') dark = true; } if(!dark) res = min(step,res); memcpy(f,backup,sizeof f); } if(res > 6) res = -1; cout << res << endl; } }