全排列(permutation)的有关问题,拿数字为例(123的全排列)有
123 132
213 231
312 321
(1234的全排列)
1: 1234 1243 1324 1342 1423 1432 //黑体部分恰好为剩下三个数的全排列
2: 2134 2143 2314 2341 2413 2431
3: 3124 3142 3214 3241 3412 3421
4: 4123 4132 4213 4231 4312 4321
#include<iostream>
using namespace std;
void perm(int a[],int k,int m)//对数组a[]从k到m
{
if(k==m)//已经排完一种情况并输出
{
cout<<a;
cout<<endl;
}
else
for(int i=k;i<=m;i++)
{swap(a[k],a[i]);
perm(a,k+1,m); //递归
swap(a[k],a[i]);} //还原
}
int main()
{
int a[4];
cin>>a;
perm(a,0,3);
return 0;
}
但此时输出结果的顺序,与预列的不一致
原因是代码中交换的步骤,比如当i=2时将a[0]与a[2]进行交换:
此时a[0]=3,再对a[1]到a[3](2,1,4)进行全排列,将会输出
3214
3241
3124