生成 1~n的排列 枚举 暴力

小白 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;
}
View Code

 

posted on 2013-07-12 23:51  Forgiving  阅读(122)  评论(0编辑  收藏  举报