听到好多人骂 n≤8 暴力无脑过
这样先考虑对于第一个状态求出对应的 81 种符合条件的密码,然后再 O(n) 暴力判每一个密码
大概是 O(n) 带约 4×102 的常数
这样开到 n≤104 是完全没问题的,不过也只是个暴力,这个题目本身决定了这就是一道噗叽题,只是 n≤8 引导更多的人打了暴力而已,我不相信 S 组的选手会想不到这样几乎无脑的优化
这份代码是过了洛谷的自测,其他的没测,顺手写的
#include <bits/stdc++.h>
#include <bits/extc++.h>
int n, a[9][6], p[82][6], tot, dif, ans;
bool f;
bool check(int t[]) {
for (int i = 2; i <= n; i++) {
dif = 0, f = false;
for (int j = 1; j <= 5; j++)dif += (a[i][j] != t[j]);
if (dif == 1)continue;
if (dif != 2)return false;
for (int j = 1; j <= 5; j++)if (a[i][j] != t[j] && a[i][j + 1] != t[j + 1] && (t[j] - a[i][j] + 10) % 10 == (t[j + 1] - a[i][j + 1] + 10) % 10) {f = true; break;}
if (!f)return false;
}
return true;
}
signed main() {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
std::cin >> n;
for (int i = 1; i <= n; i++)for (int j = 1; j <= 5; j++)std::cin >> a[i][j];
for (int i = 1; i <= 81; i++)for (int j = 1; j <= 5; j++)p[i][j] = a[1][j];
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 5; j++)p[++tot][j] += i, p[tot][j] %= 10;
for (int j = 1; j <= 4; j++)p[++tot][j] += i, p[tot][j + 1] += i, p[tot][j] %= 10, p[tot][j + 1] %= 10;
}
for (int i = 1; i <= 81; i++)ans += check(p[i]);
return std::cout << ans, 0;
}