#输入整数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;
}