一二三四五 上山打老虎

蓝桥杯-费解的开关

链接:https://www.acwing.com/problem/content/97/

思路:枚举第一行状态后其余行应该如何操作就确定了,判断最后行和按的次数是否满足条件即可
可以通过位移来模拟按一次改变五个位置的开关,通过异或实现开关。

坑点:要求是把灯全打开,1代表打开

#include<bits/stdc++.h>

using namespace std;
int s[10][10];
int atm[10][10];
int dx[]={0,-1,0,1,0};
int dy[]={-1,0,1,0,0};
void ch(int x,int y){
    for(int i=0;i<=4;i++){
        atm[x+dx[i]][y+dy[i]]^=1;
    }
}
int check(int ans){
    for(int i=2;i<=5;i++)
        for(int j=1;j<=5;j++){
            if(!atm[i-1][j]){
                ch(i,j);
                ans++;
            }
        }
    for(int i=1;i<=5;i++)
        if(!atm[5][i])return -1;
    return ans;
}
int main (){
    int n;
    cin>>n;
   
    while(n--){
         int num=7;
        for(int i=1;i<=5;i++)
            for(int j=1;j<=5;j++)
            scanf("%1d",&s[i][j]);
        for(int i=0;i<(1<<5);i++){
            int ans=0;
            memcpy(atm,s,sizeof(s));
            for(int j=0;j<5;j++){
                if(i&(1<<j)){
                    ch(1,j+1);
                    ans++;
                }
            }
            int t=check(ans);
            if(t==-1)continue;
            else num=min(t,num);
        }
        cout<<((num>6)? -1:num)<<endl;
    }
    
    
    return 0;
}
posted @ 2021-04-08 10:51  黒川川  阅读(77)  评论(0)    收藏  举报