不难证明,当第一行被固定时,灯阵只会有一种点击方式,且第 $(i,j)$ 个等如果是 $0$ ,只有通过点亮 $(i+1,j)$ 的灯来改变。每一行确定时,就固定此行即可。
感谢 @自然无界 帮我查出了代码的 $\text{bug}$
#include<bits/stdc++.h>
using namespace std;
void file(){
freopen("lights.in","r",stdin);
freopen("lights.out","w",stdout);
}
int n;
char a[6][6];
int b[6][6];
int c[6][6];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void change(int x,int y){
b[x][y]=!b[x][y];
for(int i=0;i<4;i++){
int fx=dx[i]+x;
int fy=dy[i]+y;
if(fx>=1&&fx<=5&&fy>=1&&fy<=5)
b[fx][fy]=!b[fx][fy];
}
}
int main(){
cin>>n;
for(int k=1;k<=n;k++){
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
cin>>a[i][j],b[i][j]=a[i][j]-'0',c[i][j]=b[i][j];
int ans=0x3f;
bool lights[6];
for(int u=0;u<=31;u++){
int pans=0;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
b[i][j]=c[i][j];
memset(lights,false,sizeof(lights));
for(int k=0;k<=4;k++)
if((u>>k)&1){
lights[k+1]=true;
}
bool we=false;
for(int i=1;i<=5;i++){
if(lights[i]){
change(1,i);
pans++;
}
}
for(int i=1;i<=4;i++)
for(int j=1;j<=5;j++){
if(!b[i][j]){
change(i+1,j);
if(++pans>6) {
we=true;
break;}
}
}
bool yes=false;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++){
if(!b[i][j]){
yes=true;
break;
}
}
if(!yes&&!we)
ans=min(ans,pans);
}
if(ans>6) cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}