ACWing95. 费解的开关
题解
这道题目有三个状态条件值得考虑:
- 每一个开关被按0次或者1次才有意义,如果超过1次,那么等同于按0或1次。
- 最终的结果与按的顺序无关
- 因为2,所以可以人为地规定比较合理的顺序。
现在以每一行为顺序。先经过一波操作把上一行全部搞成1,然后看这行,如果有0,那么只能按下一行的,以此类推。
起始状态难以把握,但是我们可以使用暴力枚举。
暴力地把第一行分割为2^5种情况。
代码
#include <bits/stdc++.h> using namespace std; int origin[7][7]; int tmp[7][7]; inline void op(int i, int j) { tmp[i][j] = (tmp[i][j]+1)%2; tmp[i+1][j] = (tmp[i+1][j]+1)%2; tmp[i-1][j] = (tmp[i-1][j]+1)%2; tmp[i][j+1] = (tmp[i][j+1]+1)%2; tmp[i][j-1] = (tmp[i][j-1]+1)%2; } int baoli = 0; int main() { int T; cin >> T; while(T--) { for(int i = 1; i <= 5; i++) { char buf[12]; scanf("%s", buf+1); for(int j = 1; j <= 5; j++) origin[i][j] = buf[j]-'0'; } int ans = 0x3f3f3f3f; for(baoli = 0; baoli < 32; baoli++) { int cnt = 0; for(int i = 1; i <= 5; i++) for(int j = 1; j <= 5; j++) tmp[i][j] = origin[i][j]; for(int i = 0; i < 5; i++) { if((baoli>>i)&1) { op(1, i+1); cnt++; } } for(int i = 1; i <= 4; i++) for(int j = 1; j <= 5; j++) { if(tmp[i][j]==0) { op(i+1,j); cnt++; } if(cnt > 6) break; } if(cnt>6) continue; for(int i = 1; i <= 5; i++) { if(tmp[5][i]==0) goto lab1; } ans = min(ans, cnt); lab1: ; } if(ans == 0x3f3f3f3f) printf("-1\n"); else printf("%d\n", ans); } return 0; }
本文来自博客园,作者:心坚石穿,转载请注明原文链接:https://www.cnblogs.com/xjsc01/p/16438226.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!