voidturn(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; } }
intmain() { int n; cin >> n; while(n--) { for(int i = 0;i < 5; i++) cin >> g[i]; int res = 10;//初始化答案,大于6即可 for(int op = 0; op < 32; op++)//第一行的32种情况 { int step = 0; memcpy(cp, g, sizeof(g));//拷贝一份 for(int i = 0; i < 5; i++)//对第一行进行操作 { if(op >> i & 1)//这个数的二进制哪一位是1就改变哪个位置的状态(不管它现在是什么状态) { step++; turn(0, 4-i); } } for(int i = 0; i < 4; i++)//对2~4行进行操作 { for(int j = 0; j < 5; j++) { if(g[i][j] == '0') //如果(i, j)是0,就改变(i + 1, j) { turn(i + 1, j); step++; } } } //判断最后一行是不是都是1 bool dark = false; for(int i = 0; i < 5; i++) { if(g[4][i] == '0') dark = true; } if(!dark) res = min(res, step); memcpy(g, cp, sizeof(cp));//拷贝回来 } if(res <= 6) cout << res << endl; else cout << -1 << endl; } return0; }