蓝桥杯-费解的开关
链接: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;
}

浙公网安备 33010602011771号