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