/*
2、数字全排列(numlist.pas/in/out)
列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入一个整数n(1≤n≤9)输出由1~n组成的所有不重复的数字序列,每行一个序列,数字与数字之间用空格隔开,行首行尾不留空格。
样例输入:numlist.in3
样例输出:numlist.out
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
*/
#include<stdio.h>
#include<string.h>
int flag[10],a[10],b,n;//b代表层数(递归用栈理解),终止条件。
void print()
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
void fun(int b)
{
int i;
if(b==n) print();
else {
for(i=1;i<=n;i++)
if(!flag[i])
{
flag[i]=1;
a[b]=i;
fun(b+1);
flag[i]=0;
}
}
}
void main()
{
memset(flag,0,sizeof(flag));
scanf("%d",&n);
fun(0);
}
-------------------------------------------------------------------------------------------------------------------------------------------------------
//答案与结果不符合顺序,但不失为一种思路
#include<stdio.h>
#define N 3
void swap(int *a,int x,int y)//转换
{
int temp=a[x];
a[x]=a[y];
a[y]=temp;
}
void perm(int *a,int k,int m)//实现全排序
{
int i,j;
if(k==m)
{
for(i=0;i<=m;i++)
printf("%d ",a[i]);
printf("\n");
}
else
{
for(j=k;j<=m;j++)
{
swap(a,k,j);
perm(a,k+1,m);
swap(a,k,j);
}
}
}
void main()
{
int i,a[100];
for(i=0;i<N;i++)
{
a[i]=i+1;
}
perm(a,0,N-1);
}