添加链接描述
当前行如果有灭的,只能通过下一行改变,二进制枚举第一行的开关情况,根据第一行递推改变,判断最后一行是否全亮
#include<bits/stdc++.h>
using namespace std;
const int N=10;
char mp[N][N],backup[N][N];
int dx[]={0,0,1,-1,0};//注意是五个点
int dy[]={1,-1,0,0,0};
void turn (int x,int y){
for(int i=0;i<5;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<0||nx>4||ny<0||ny>4)continue;
mp[nx][ny]^=1;
}
}
int main(){
int T;
cin>>T;
while(T--){
int ans=10;
for(int i=0;i<5;i++)cin>>mp[i];
memcpy(backup,mp,sizeof mp);
for(int i=0;i<1<<5;i++){
int tot=0;
memcpy(mp,backup,sizeof mp);
// cout<<"---"<<endl;
// for(int i=0;i<5;i++)cout<<mp[i]<<"\n";
for(int j=0;j<5;j++){
if(i>>j&1){
turn(0,j);
tot++;
}
}
for(int j=0;j<4;j++){
for(int k=0;k<5;k++){
if(mp[j][k]=='0'){
turn(j+1,k);
tot++;
}
}
}
int ok=1;
for(int j=0;j<5;j++){
if(mp[4][j]=='0')ok=0;
}
if(ok)ans=min(ans,tot);
// cout<<"---"<<endl;
// for(int i=0;i<5;i++)cout<<mp[i]<<"\n";
}
if(ans<=6)
cout<<ans<<"\n";
else cout<<"-1\n";
}
return 0;
}