(蓝桥)递推
递推就是根据前面的状态推导出后面的状态
费解的开关
位运算:::判断第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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话