(蓝桥)递推

递推就是根据前面的状态推导出后面的状态

费解的开关

位运算:::判断第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;
}

复制代码

 

posted @   敲代码的6  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示