本题要求实现一个递归函数,生成给定字符集合内所有的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); //迭代
}
}
}
}