1 条题解

  • 0
    @ 2026-1-27 22:15:49
    #include <bits/stdc++.h>
    using namespace std;
    
    // [1] l-密码的目标长度;n-可选字符的总数;sum-已输出的有效密码数量(控制最多输出25000个)
    int l,n,sum=0; 
    // [2] c数组-存储输入的可选字符集;arr数组-存储当前正在生成的密码(临时缓冲区)
    char c[30],arr[30];
    
    // [3] dfs递归函数:生成符合条件的密码
    // 参数说明:
    // len - 当前已选择的字符数量(当前密码的长度)
    // x - 当前在字符集c中的起始下标(保证密码字符按字母顺序递增,避免重复和乱序)
    // y - 当前密码中的元音字符数量
    // f - 当前密码中的辅音字符数量
    void dfs(int len,int x,int y,int f){
        // 递归终止条件:当前密码长度达到目标l,且满足有效密码的条件(至少1个元音,至少2个辅音)
        if(len == l && y>=1 && f>=2){
            sum++;  // [4] 有效密码数+1
            // 输出当前生成的密码
            for(int i=0;i<l;i++) cout<<arr[i];
            cout<<endl;
            return ;
        }
        // 遍历字符集c中从x开始的字符(保证密码字符递增,避免重复组合)
        for(int i=x;i<n && sum<25000;i++){  // [5] 同时限制sum<25000,避免输出过多
            arr[len]=c[i];  // [6] 将当前字符c[i]加入到正在生成的密码arr中
            // 判断当前字符是元音还是辅音,更新对应的计数并递归
            if(c[i]=='a' || c[i]=='e' || c[i]=='i' || c[i]=='o' || c[i]=='u' ){
                // 元音字符:y+1,辅音f不变,下一个字符从i+1开始(保证递增)
                dfs(len+1,i+1,y+1,f);
            }else{
                // 辅音字符:f+1,元音y不变,下一个字符从i+1开始
                dfs(len+1,i+1,y,f+1);
            }
        } 
    }
    
    int main() {
        cin>>l>>n;  // [7] 读取密码目标长度l和可选字符总数n
        for(int i=0;i<n;i++) cin>>c[i];  // [8] 读取可选字符集,存入c数组
        
        sort(c,c+n);  // [9] 对字符集c排序,保证后续生成的密码按字母顺序递增
        dfs(0,0,0,0);  // [10] 开始递归生成密码:初始长度0,起始下标0,元音0个,辅音0个
        return 0;
    }
    
    • 1

    信息

    ID
    1283
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者