递归输出全排列

#输入整数n(n∈(0,10)),按字典序输出1~n的全排列。

#解法是暴力排序,核心思想在于依次确定每位数字,确定每位数字的方法相同,故可使用递归。每位数字均是从1开始检验,确定了一位后进行标记,递归进入下一位的确定,遇到已经标记的数字则跳过。

#字典序的完成:顺序的检查带来了顺序的排列。

#step记载了每一位上的排列可能性完成情况,根据递归的特点,很显然是越高位(越深层递归)越先完成一次step到n。

#include<stdio.h>
#include<string.h>

int out_put[10];                   //输出数组
int check[10];                     //检查数组
int n;                             

void run_f(int step)       
{
    int i;
    int x;
    int num[10]={0,1,2,3,4,5,6,7,8,9};        //设置一个正序的数组当取用源
//填充out_put数组
    for(i=1;i<=n;i++)                                   
    {

        x=num[i];                             //提出第i个数
        if(!check[x])                         //检查第i个数有没有被排序
        {
            out_put[step]=x;                  //如果没有,将第i个数提出到out_put数组
            check[x]=1;                       //标记被提出的数字,下次检查时便可跳过
            run_f(step+1);                    //检查点下移
            check[x]=0;                       
        }
    }
//out_put填充完成则输出
   if(step==n)                               
    {
        for(i=1;i<=step;i++)
            printf("%d",out_put[i]);
        printf("\n");
        return;
    }
}

int main()
{
    scanf("%d",&n);
    memset(check ,0,sizeof(check));              //将check数组元素全设置为0
    run_f(1);                                    //从第一个位置开始

    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014302425/article/details/79934467