全排列
要对一个n个数进行全排列,可以分解为n个子问题,然后分别固定这n个数对每个子问题又分子问题,直到不能分解为止,例如:12345
子问题为 1 2345 12 345 13 245 14 235 15 234 123 45 123 54 1234 5
2 1345
3 1245
4 1235
5 1234
红色为前缀,然后再以后面的数继续分自问题
#include <iostream>
using namespace std;
void change(int & x,int &y){
int p;
p=x;x=y;y=p;
}
void perm(int a[],int k,int n){ //k用于移动,把数组下标为0~k-1的数作为前缀
if(k==n){ //递归出口,当移动到了最后,没有子问题
for(int i=0;i<=n;i++)
cout<<a[i];
cout<<endl;
}
for(int i=k;i<=n;i++){ // 每次分别固定第一个数不变
change(a[k],a[i]); //用于交换两个数
perm(a,k+1,n); //子问题递归
change(a[i],a[k]); //交换回原来的顺序,相当于第一个change的回溯
}
}
int main()
{
int a[]={1,2,3,4,5};
perm(a,0,4) ;
return 0;
}