数据结构考研大题----递归实现全排列

题目描述:请你用递归实现n个数的全排列。

 

算法思想:

       首先定义三个数组,一个是存放输入数据的数组a;一个是用来存放排列后的数据的数组c;一个是用来标记此数据是否已存入c数组的数组b;

int a[];
int b[];
int c[];

        设置一个循环,从0-->n-1,在循环里依次将a[i]存入c[k](k为数组c的下标,与i可能相同,可能不同),每次存入时都将b[i]置为1,意为下标为i的节点已存入数组c。

       然后进入递归 ,函数名(a,k+1,n)----->每次递归k都要+1,保证a的数据依次存放在c里,而不会把c中原有的数据覆盖。在递归后面要将b[i]=0,因为要回溯。若不将b[i]=0,则只会输出一行数据,即初始数据。

      在循环前设置递归的退出条件 (k == n).在退出条件里就可以输出数组c,然后return;

void permutation(int *a,int k,int n)
{
    if(k == n )
    {
        for(int i=0;i<n;i++)
            std::cout<<c[i]<<" ";
        std::cout<<std::endl;
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(b[i]==0)
        {
            b[i]=1;
            c[k] = a[i];
            permutation(a,k+1,n);
            b[i]=0;
        }
    }
}

下面贴上10以内的全排列递归实现:

#include <iostream>

int b[10] = { 0 };
int c[10];
int a[10];

void permutation(int *a,int k,int n)
{
    if(k == n )
    {
        for(int i=0;i<n;i++)
            std::cout<<c[i]<<" ";
        std::cout<<std::endl;
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(b[i]==0)
        {
            b[i]=1;
            c[k] = a[i];
            permutation(a,k+1,n);
            b[i]=0;
        }
    }
}

int main()
{

    int n;
    std::cin>>n;
    for(int i=0;i<n;i++)
        std::cin>>a[i];
    std::cout<<std::endl;
    permutation(a,0,n);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值