C语言 密码生成

该博客介绍了如何使用递归函数来生成指定长度的密码,其中密码的每个字符都来自给定的字符集合,并且相邻字符不能相同。给出了具体的函数实现,用于在给定的字符集中生成所有可能的n位密码,例如字符集为'ABC#',长度为2时,所有符合条件的密码包括'ABA', 'ABC', 'AB#', 'ACA', 'ACB', 'AC#', ...。文章通过递归和字符串操作展示了如何处理相邻字符不相同的条件,帮助读者理解递归在解决此类问题中的应用。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值