AcWing 95. 费解的开关
原题链接
中等
作者:
Value
,
2020-06-27 14:16:06
,
所有人可见
,
阅读 405
#include <iostream>
#include <cstring>
using namespace std;
char graph[10][10], backup[10][10];
int dic[5][2] = {
{0, -1}, {-1, 0}, {0, 1}, {1, 0}, {0, 0}
};
void change(int x, int y){
for(int i = 0; i < 5; i ++ ){
int xx = x + dic[i][0], yy = y + dic[i][1];
if(xx < 0 || xx >= 5 || yy < 0 || yy >= 5) continue;
backup[xx][yy] ^= 1;
}
}
bool check(){
for(int i = 0; i < 5; i ++ ){
if(backup[4][i] == '0') return false;
}
return true;
}
int work(){
int res = 0x3f3f3f;
for(int i = 0; i < (1 << 5); i ++ ){
memcpy(backup, graph, sizeof graph);
int cnt = 0;
for(int j = 0; j < 5; j ++ ){
if(i >> j & 1) {cnt ++ , change(0, j);}
}
for(int j = 0; j < 4; j ++ ){
for(int k = 0; k < 5; k ++ ){
if(backup[j][k] == '0'){
cnt ++ ;
change(j + 1, k);
}
}
}
if(check()) res = min(res, cnt);
}
if(res > 6) return -1;
return res;
}
int main(){
int n; cin >> n;
while(n -- ){
for(int i = 0; i < 5; i ++ ) cin >> graph[i];
cout << work() << endl;
}
return 0;
}