CSP-S 2023 密码锁
模拟
算法 1
对于 \(n = 1\) 的情况,答案为 \(81\)。
算法 2
枚举每个状态可以到达的状态,并且用 std::map
记录下来,如果一个状态出现了 \(n\) 次,说明 \(n\) 个状态都能到达它,那么它就可能是一个正确密码。时间复杂度为 \(O(nmk \log nmk)\)。其中 \(m\) 为密码锁的长度,\(k\) 为枚举新状态的数量。
#include <bits/stdc++.h>
int n, ans;
std::map<std::string, int> mp;
std::string getString(int a, int b, int c, int d, int e) {
std::string res;
res.push_back(a + '0');
res.push_back(b + '0');
res.push_back(c + '0');
res.push_back(d + '0');
res.push_back(e + '0');
return res;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n;
for (int i = 1; i <= n; i++) {
int a, b, c, d, e;
std::cin >> a >> b >> c >> d >> e;
for (int k = 1; k <= 9; k++) {
mp[getString((a + k) % 10, b, c, d, e)]++;
mp[getString(a, (b + k) % 10, c, d, e)]++;
mp[getString(a, b, (c + k) % 10, d, e)]++;
mp[getString(a, b, c, (d + k) % 10, e)]++;
mp[getString(a, b, c, d, (e + k) % 10)]++;
mp[getString((a + k) % 10, (b + k) % 10, c, d, e)]++;
mp[getString(a, (b + k) % 10, (c + k) % 10, d, e)]++;
mp[getString(a, b, (c + k) % 10, (d + k) % 10, e)]++;
mp[getString(a, b, c, (d + k) % 10, (e + k) % 10)]++;
}
}
for (auto i : mp) {
if (i.second == n) {
ans++;
}
}
std::cout << ans << '\n';
return 0;
}