第一种:(字典序)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[10],p[10],vis[10];//标记为1则说明已固定
int n;
void digui(int l){
int i;
if(l>n){
for(i=1;i<n;i++){
printf("%d ",p[i]);
}
printf("%d\n",p[n]);
}
for(i=1;i<=n;i++){
if(!vis[a[i]]){
p[l]=a[i];
vis[a[i]]=1;
digui(l+1);
vis[a[i]]=0;
}
}
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++){
a[i]=i;
}
memset(vis,0,sizeof(vis));
digui(1);
return 0;
}
第二种:(非字典序)
#include <stdio.h>
#include <stdlib.h>
int n=0;
void swap(int *a,int *b)
{
int m;
m=*a;
*a=*b;
*b=m;
}
void all_pailie(int a[],int k,int m)
{
int i;
if(k>m)
{
for(i=0; i<=m; i++)
{
printf("%d ",a[i]);
}
printf("\n");
n++;
}
else
{
for(i=k; i<=m; i++)
{
swap(&a[k],&a[i]);
all_pailie(a,k+1,m);
swap(&a[k],&a[i]);
}
}
}
int main()
{
int a[]= {1,2,3,4,5};
all_pailie(a,0,4);
return 0;
}