tyvj 1266 費解的開關
阿新 • • 發佈:2018-12-10
解題思路
列舉第一行的狀態,判斷後面可不可行。
程式碼
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 15;
const int inf = 0x3f3f3f3f;
int n,a[MAXN][MAXN],ans=7,tmp[MAXN],now[MAXN][MAXN];
int check(){
int ret=0;
for(int i=1;i<=5;i++) ret+=tmp[i],now[1 ][i]=tmp[i];
if(ret>=ans) return ret;
for(register int i=2;i<=5;i++)
for(register int j=1;j<=5;j++){
if((now[i-1][j]^now[i-1][j-1]^now[i-1][j+1]^a[i-1][j]^now[i-2][j])!=1) {ret++;now[i][j]=1;}
else now[i][j]=0;
if(ret>=ans) return ret;
}
for (register int i=1;i<=5;i++)
if((now[5][i-1]^now[5][i]^now[5][i+1]^a[5][i]^now[4][i])!=1) return 7;
return ret;
}
void dfs(int x){
if(x==6) {ans=min(ans,check());return;}
tmp[x]=1;dfs(x+1);
tmp[x]=0;dfs(x+1);
tmp[x]=0;
}
int main(){
cin>>n;
while(n--){
ans=7 ;
for(register int i=1;i<=5;i++){
char c[MAXN];scanf("%s",c+1);
for(register int j=1;j<=5;j++)
a[i][j]=c[j]=='0'?0:1;
}
dfs(1);if(ans==7) ans=-1;
printf("%d\n",ans);
}
return 0;
}