有1、2、3、4、5、6六个数,对其进行全排列并输出种数。如1、2、3的全排列为123、132、213、231、312、321共6种。
我们可以怎么想,所有排列,要么1开头要么2开头要么3开头......要么6开头,然后假设在以1开头的全排列中,再同样思考,1后面的5个数,除了1外,要么以2开头要么3开头......要么6开头,然后假设在以2开头的全排列中,同样思考,2后面的4个数,除1、2外,要么3开头.........依次类推,到最后只剩一个数则结束。
代码如下:
//全排列问题
#include <iostream>
using namespace std;
int n ;//记录排列个数
void swap(char & a ,char & b);//交换
void permutation(char array[],int k, int m );//递归实现
int main()
{
char array[] ="123456";
permutation(array,0,5);//对数组list中的元素进行全排列
cout<<"times:"<<n<<"\n";
return 0;
}
void swap(char & a ,char & b)
{
int temp ;
temp = a;
a = b;
b = temp;
}
void permutation(char array[],int k, int m )
{
int i;
if(k > m)//递归结束条件
{
for(i = 0 ; i <= m ; i++)//打印
{
cout<<array[i];
}
cout<<"\n";
n++;
}
else
{
for(i = k ; i <= m;i++)
{
swap(array[k],array[i]);//将k到m之间的数一个一个与k交换
permutation(array,k + 1,m);//对k+1和m之间的数进行全排列
swap(array[k],array[i]);//再次交换回到原序,避免影响下次全排列
}
}
}