思路:
1.用数组记录操作后的序列,输出结果时只需要输出该数组即可;
2.交换第1个元素与第i(1=<i<=n)个元素,得到n个序列;把每个序列分成两部分:第一个元素,其余的元素;对其余元素执行全排列操作;(记得操作完后,将这两个元素交换回来,以方便下面的交换)
3.当剩余序列中只有一个元素时,得到一种排列结果,输出该结果
比如:集合{ 1,2,3}的全排列为:
{ 1 2 3 }
{ 1 3 2 }
{ 2 1 3 }
{ 2 3 1 }
{ 3 2 1 }
{ 3 1 2 }
#include <stdio.h>
#include <iostream>
#include <iterator>
using namespace std;
void swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void perm(int list[],int begin, int end)
{
if ( begin == end )
{
copy(list,list+end+1,ostream_iterator<int>(cout," "));
cout<<endl;
}
for (int i = begin; i <= end; i++)
{
swap( &list[begin], &list[i]);
perm(list, begin + 1, end);
swap( &list[begin], &list[i]);
}
}
int main()
{
int list[]={1,2,3,4,5};
perm(list, 0, 4);
return 0;
}