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;
}
posted @ 2024-10-03 15:32  Unino  阅读(15)  评论(0)    收藏  举报