AcWing 95. 费解的开关
原题链接
中等
作者:
文氘
,
2024-04-08 22:41:04
,
所有人可见
,
阅读 2
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int>PII;
const int N=6;
char g[N][N],back[N][N];
int n;
int dx[]={0,-1,0,1,0},dy[]={-1,0,1,0,0};
void turn(int x,int y){
for(int i=0;i<5;i++){
int a=x+dx[i],b=y+dy[i];
if(a<0||b<0||a>=5||b>=5) continue;
if(g[a][b]=='0') g[a][b]='1';
else g[a][b]='0';
/*
g[a][b]^=1;
这一句可以替代上面的开关状态转换,但是我不知道为什么,有大佬可以解释嘛
*/
}
}
int main(){
cin>>n;
while(n--){
for(int i=0;i<5;i++) cin>>g[i];
int res=10;
for(int op=0;op<32;op++){
int step=0;
memcpy(back,g,sizeof g);
//处理第一行
for(int i=0;i<5;i++){
if(op>>i&1){
turn(0,i);
step++;
}
}
//处理2-4行
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
if(g[i][j]=='0'){
step++;
turn(i+1,j);
}
}
}
bool flag=false;
for(int i=0;i<5;i++){
if(g[4][i]=='0'){
flag=true;
break;
}
}
if(flag==false) res=min(res,step);
memcpy(g,back,sizeof g);
}
if(res>6) res=-1;
cout<<res<<endl;
}
return 0;
}