C语言 密码生成

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

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); //迭代
            }
        }
    }
}

你可能感兴趣的:(c语言,开发语言,蓝桥杯)