4 solutions
-
0
Guest MOD
-
2
方法思路
处理原密码:将输入的原密码转换为n位字符串,不足的位数在前面补零。
生成所有可能的密码:使用递归生成所有可能的密码。每一步可以选择是否改变某一位数字,改变的话可以是加1或减1(循环处理0和9的情况),最多改变k位。
去重和排序:将生成的密码存入集合中以避免重复,自动排序。
输出结果:按升序输出所有可能的密码。
#include <iostream> #include <set> #include <string> using namespace std; set<int> r; void g(const string& s, int k, int p, int c, string cur) { if (p == s.size()) { if (c <= k) r.insert(stoi(cur));return; }g(s, k, p + 1, c, cur + s[p]); if (c < k) {int d = s[p] - '0'; g(s, k, p + 1, c + 1, cur + to_string((d + 1) % 10)); g(s, k, p + 1, c + 1, cur + to_string((d - 1 + 10) % 10)); } }int main() { int n, a, k;cin >> n >> a >> k; string s = to_string(a); while (s.size() < n) s = "0" + s; g(s, k, 0, 0, ""); for (int num : r) cout << num << endl; return 0; }
Information
- ID
- 698
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- (None)
- # Submissions
- 123
- Accepted
- 30
- Uploaded By