利用递归求解全排列的思路:
第一层:让第一个数不同,得到n个数列,办法是第一个数和后面的每个数进行交换
这样做的n个数列,只要第一个数不同,不管后面的n-1个数怎么排列,这n个数列都不同
第二层:在上面的每个数列中去掉第一个数,对后面的n-1个数进行类似的排列
。。。
重复以上步骤,直到用完所有数字
即: begin==end
#include <bits\stdc++.h>
using namespace std;
#define Swap(a,b) {int t=a; a=b; b=t;}
int data[]={1,2,3,4,5,6,7,8,9,10};
int num;
int perm(int begin,int end)
{
int i,j;
if(begin==end)//begin==end 代表递归结束,已经产生了一个新的全排列
{
num++;//记录全排列的个数
/*
//所有处理排列的问题都在这里进行 打印或者处理全排列的队列
for(j=0;j<10;j++)
{
printf("%d ",data[j]);
}
printf("\n");
*/
}
else
{
for(i=begin;i<=end;i++)
{
Swap(data[begin],data[i]);//第一层递归,调换第一个数与之后数的位置
perm(begin+1,end);//
Swap(data[begin],data[i]);//恢复状态,用于下一次交换
}
}
}
int main()
{
perm(0,9);
printf("%d\n",num);
return 0;
}