0
点赞
收藏
分享

微信扫一扫

95. 费解的开关 (二进制枚举 指数型dfs

云上笔记 2022-03-24 阅读 26

添加链接描述
当前行如果有灭的,只能通过下一行改变,二进制枚举第一行的开关情况,根据第一行递推改变,判断最后一行是否全亮

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

举报

相关推荐

0 条评论