(蓝桥)递推
递推就是根据前面的状态推导出后面的状态
费解的开关
位运算:::判断第op种方案中的第k位数字是否是1? op右移k位与1与运算 (op>>k&1)
把字符串中的0或1取反:与1做异或操作 (x^=1)

题目https://www.acwing.com/problem/content/97/
文章https://blog.csdn.net/weixin_45662399/article/details/123607593?
//文章讲解详细 //https://blog.csdn.net/qq_45832461/article/details/114891869?ops
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=6; char g[N][N],backup[N][N]; int px[5]={0,0,0,1,-1},py[5]={0,1,-1,0,0}; void turn(int i,int j) { for(int q=0;q<5;q++){ int x=i+px[q]; int y=j+py[q]; if(x<0||x>=5||y<0||y>=5) continue;//注意边界 g[x][y]^=1; } } int main() { int n;cin>>n; while(n--){ for(int i=0;i<5;i++) cin>>g[i]; int res=10; for(int i=0;i<32;i++){//这里是-1层的分析,所有的情况,因为第0层还不确定,因为是求最小值 memcpy(backup,g,sizeof g);//备份,后面再备份回来 int step=0; for(int j=0;j<5;j++){ if(i>>j&1){//位运算 判断第几位是0 or 1 step++; turn(0,4-j);//注意是调整的第0层,位运算和顺序相反,所以4-j } } for(int p=0;p<4;p++){ for(int q=0;q<5;q++){ if(g[p][q]=='0'){ step++; turn(p+1,q); } } } bool dack=false;//看最后一行是否全亮 for(int k=0;k<5;k++){ if(g[4][k]=='0') { dack=true; break; } } if(!dack) res=min(res,step);//全亮更新数值 memcpy(g,backup,sizeof backup); } if(res>6) res=-1; cout<<res<<endl; } return 0; }

浙公网安备 33010602011771号