zl程序教程

您现在的位置是:首页 >  其它

当前栏目

95. 费解的开关【二级制枚举】

枚举 二级 开关 95
2023-09-11 14:15:52 时间

在这里插入图片描述
二进制枚举第一行的操作状态。

#include<bits/stdc++.h>
using namespace std;
const int N=30;
char a[N][N],b[N][N];
int n,ans;
int dx[5]={0,-1,0,0,1};
int dy[5]={0,0,-1,1,0};
char get(char c)
{
    if(c=='0') return '1';
    else return '0';
}
void solve(int x,int y)
{
    for(int i=0;i<5;i++)
    {
        int tempx=x+dx[i],tempy=y+dy[i];
        if(tempx>=0&&tempx<5&&tempy>=0&&tempy<5) 
            a[tempx][tempy]=get(a[tempx][tempy]);
    }
}
void dfs(int x)
{
    memcpy(a,b,sizeof b);
    int cnt=0,flag=1;
    for(int i=0;i<5;i++) if((x>>i)&1) solve(0,i),cnt++;
    for(int i=1;i<5;i++)
        for(int j=0;j<5;j++) if(a[i-1][j]=='0') solve(i,j),cnt++;
    for(int i=0;i<5;i++) if(a[4][i]=='0') flag=0;
    if(flag) ans=min(ans,cnt);
}
int main(void)
{
    cin>>n;
    while(n--)
    {
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++) 
                cin>>a[i][j],b[i][j]=a[i][j];
        ans=7;
        for(int i=0;i<(1<<5);i++) dfs(i);
        printf("%d\n",ans>6?-1:ans);
    }
    return 0;
}