全排列问题:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。如:1,2,3三个元素的全排列为:1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1
#include<cstdio>
#include<iostream>
using namespace std;
#define N 10000
void Swap(int *x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}
//be是开始位置 en是结束位置
int fullpermutation(int a[], int be, int en)
{
int i;
if(be >= en)// 找到一个排列
{
for (i = 0; i < en; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
else// 没有找完一个排列,则继续往下找下一个元素
{
for (i = be; i < en; i++)
{
if (be != i)
{
Swap(&a[be], &a[i]); // 交换
}
// 递归排列剩余的从begin+1到end的元素
fullpermutation(a, be + 1, en);
if (be != i)
{
Swap(&a[be], &a[i]); // 回溯时还原
}
}
}
}
int main()
{
int n;
cin >> n;
int a[N];
//初始化数组
for(int i=0; i<n; i++){
a[i] = i+1;
}
fullpermutation(a, 0, n);
return 0;
}