4 solutions

  • 2
    @ 2025-10-9 15:36:58

    方法思路

    ​​处理原密码​​:将输入的原密码转换为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