1 条题解
-
0
#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
- 上传者