本题要求实现一个递归函数,生成给定字符集合内所有的n位密码,要求密码的相邻字符不同。例如,给定字符集合为1A2B,所有符合要求的2位密码为1A 12 1B A1 A2 AB 21 2A 2B B1 BA B2。
函数接口定义:
void generatePasswords(char *characters, int n);
其中,characters是用户输入的字符集合,n是密码长度(n>1),可增加递归函数实现上述功能。
裁判测试程序样例:
#include <stdio.h>
void generatePasswords(char *characters, int n);
int main()
{
int n;
char characters[256];
scanf("%s %d", characters, &n);
generatePasswords(characters, n);
return 0;
}
/* 请在这里填写答案 */
输入样例:
ABC# 3
输出样例:
ABA
ABC
AB#
ACA
ACB
AC#
A#A
A#B
A#C
BAB
BAC
BA#
BCA
BCB
BC#
B#A
B#B
B#C
CAB
CAC
CA#
CBA
CBC
CB#
C#A
C#B
C#C
#AB
#AC
#A#
#BA
#BC
#B#
#CA
#CB
#C#
以下为代码:
void generatePasswordsRec(char *Sofar, int next, char *characters, int former, int n);
void generatePasswords(char *characters, int n)
{
char Sofar[256] = {'\0'};
generatePasswordsRec(Sofar, 0, characters, -1, n);
}
void generatePasswordsRec(char *Sofar, int next, char *characters, int former, int n)
{
int i;
if(n == 0)
printf("%s\n", Sofar); //递归出口,输出字符串
else
{
for(i = 0; characters[i]; i++)
{
if(former == i)
continue; //相邻相等进入下一个循环
else{
Sofar[next] = characters[i];
generatePasswordsRec(Sofar, next+1, characters, i, n - 1); //迭代
}
}
}
}
该博客介绍了如何使用递归函数来生成指定长度的密码,其中密码的每个字符都来自给定的字符集合,并且相邻字符不能相同。给出了具体的函数实现,用于在给定的字符集中生成所有可能的n位密码,例如字符集为'ABC#',长度为2时,所有符合条件的密码包括'ABA', 'ABC', 'AB#', 'ACA', 'ACB', 'AC#', ...。文章通过递归和字符串操作展示了如何处理相邻字符不相同的条件,帮助读者理解递归在解决此类问题中的应用。

155

被折叠的 条评论
为什么被折叠?



