1 条题解
-
0
枚举+递推
由于按键的先后顺序对最后的结果并无影响,且重复按键只能做无用功,于是可以考虑对每个点按0/1次。通过枚举第一行的按键情况,可以使用二进制 表示按键情况,依次对之后的所有0进行按键反转。
#include <bits/stdc++.h> #include <cstring> using namespace std; const int N =6, inf = 0x3f3f3f3f; int t, n = 5, m, d[][2] = {0,0,-1, 0, 1, 0, 0, -1, 0, 1}; char s[N][N],g[N][N]; void turn(int x, int y) { for (int i = 0; i < 5; i++) { int a = x + d[i][0], b = y + d[i][1]; if (a < 0 || a >= n || b < 0 || b >= n) continue; g[a][b] ^= 1; } } void solve1(){ int ans = inf; for (int k = 0; k < 32; k++) { memcpy(g,s,sizeof s); int v = 0, tt = 0; for (int j = 0; j < 5; j++) if (k >> j & 1) turn(0, j), v++; for (int i = 1; i < 5; i++) for (int j = 0; j < 5; j++) if (g[i-1][j]=='0') turn(i, j), v++; for (int j = 0; j < n; j++) tt+=g[4][j]-'0'; if (v<=6 && tt==5) ans = min(ans, v); } cout << (ans == inf ? -1 : ans) << endl; } int main() { cin >> t; while (t--) { for (int i = 0; i < n; i++) cin >> s[i]; solve1(); } }
- 1
信息
- ID
- 1433
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 9
- 已通过
- 1
- 上传者