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;
    }
    
    
    • -1
      #include<iostream>
      using namespace std;
      int main(){
          int n,a,k;
          cin>>n>>a>>k;
          int lim=1;
          for(int i=1;i<=n;++i){
              lim  *=10;
          }
          for(int b=0;b<=lim;++b){
              int tempa=a,tem=b;
              int cnt=0;
              for(int i=1;i<=n;++i){
                  int x=tempa%10,y=tem%10;
                  tempa/=10;
                  tem/=10;
                  if((abs(x-y)==1)||(abs(x-y)==9)){
                      ++cnt;
                  }else if(x!=y){
                      cnt=-1;break;
                  }
              }
              if((cnt!=-1)&&(cnt<=k)){
                  cout<<b<<endl;
              }
          }
          return 0;
      }
      
      
      • -1
        @ 2025-5-27 17:25:23

        #include<bits/stdc++.h> typedef long long ll; using namespace std; const int N=10010; int n,a,k; bool f(int x){

        int sum=0,source=a;
        for(int i=1;i<=n;i++){
        	if(abs(source%10-x%10)==1||abs(source%10-x%10)==9){
        		++sum;
        	}
        	else if(abs(source%10-x%10)>=2) return 0;
        	source/=10;x/=10;
        }
        return sum<=k;
        

        } int main() { cin>>n>>a>>k; int maxn=pow(10,n); for(int i=0;i<maxn;i++){ if(f(i)){ cout<<i<<'\n'; } } }

        • -1
          @ 2024-12-1 15:30:34

          1

          • 1

          Information

          ID
          698
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          7
          Tags
          (None)
          # Submissions
          123
          Accepted
          30
          Uploaded By