1. 程式人生 > >tyvj 1266 費解的開關

tyvj 1266 費解的開關

傳送門

解題思路

列舉第一行的狀態,判斷後面可不可行。

程式碼

#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; }