小白 7.2.1
分析:尝试用递归的思想解决:先输出所有以1开头的排列(这一步是递归调用),然后输出以2开头的排列(又是递归调用),接着是以3开头的排列.......最后才是以n开头的排列
并且以1开头的排列的特点是:第一位是1,后面是2~9的排列.根据字典序的定义,这些2~9的排列也必须按照字典序排列.换句话说,我们需要"按照字典序输出2~9的排列",不过需要注意的是,在输出时,每个排列的最前面要加上那个"1".这样一来,我们设计的递归函数需要以下参数:
1.已经确定的前缀序列,以便输出
2.需要进行全排列的元素集合,以便依次选做第一个元素
#include<iostream> using namespace std; #define max 10000 int a[max]; void pailie(int n,int *a,int cur) { int i,j; if(cur==n) { for(i=0;i<n;i++) printf("%d",a[i]); printf("\n"); } else for(i=1;i<=n;i++) { int ok=1; for(j=0;j<cur;j++) if(a[j]==i) ok=0; if(ok) { a[cur]=i; pailie(n,a,cur+1); } } } int main() { int n,i; while(scanf("%d",&n)==1) { for(i=0;i<n;i++) { a[i]=1+i; } // for(cur=0;cur<n;cur++) pailie(n,a,0); } return 0; }