[AcWing 95] 费解的开关
递推
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
char a[10][10];
char g[10][10];
int dx[] = {0, -1, 0, 1, 0};
int dy[] = {0, 0, 1, 0, -1};
void change(int x, int y)
{
for (int i = 0; i < 5; i ++) {
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < 5 && b >= 0 && b < 5)
g[a][b] = g[a][b] == '0' ? '1' : '0';
}
}
void solve()
{
for (int i = 0; i < 5; i ++)
for (int j = 0; j < 5; j ++)
cin >> a[i][j];
int res = 1e9;
for (int k = 0; k < 1 << 5; k ++) {
int cnt = 0;
memcpy(g, a, sizeof a);
for (int i = 0; i < 5; i ++)
if (k >> i & 1) {
change(0, i);
cnt ++;
}
for (int i = 1; i < 5; i ++)
for (int j = 0; j < 5; j ++)
if (g[i - 1][j] == '0') {
change(i, j);
cnt ++;
}
bool st = true;
for (int i = 0; i < 5; i ++)
if (g[4][i] == '0')
st = false;
if (st)
res = min(res, cnt);
}
if (res > 6)
cout << "-1" << endl;
else
cout << res << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T;
cin >> T;
while (T --) {
solve();
}
return 0;
}
- 递推思路
从第 行开始按,前 行确定以后,第 行的按法已经确定。枚举第 行的按法,那么第 行的按法实际上是已经确定的,按完第 行之后,只要是 ( 从第 行开始),都需要 按一下,全部按完之后,判断第 行是否是全 ,若是则为合法的按法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!