运行结果:

Nearth==>分治策略001/全排列算法_全排列

代码参考:

/*
全排列问题,即一个数组arr[5]={1,2,3,4,5},一共5个数
如果以1为第一个元素,对{2,3,4,5}排序所得到的排列序列,即有:{1,2,3,5,4},{1,2,3,4,5}···
也可以把{1,2,3}看成是一个数{a},那么就对{4,5}排序,则所得的全排列为:{a,4,5},{a,5,4},
总的全排列个数为:2
*/
#include<iostream>
using namespace std;
#define MAX 10
int arr[MAX]={0};
int num=0;
void swap(int& a,int& b){
int temp=a;
a=b;
b=temp;
}
void perm(int* list,int k,int m){//k=4,m=5,即把{1,2,3}看做一个整体,对{4,5}全排列
if(k==m){
num++;
cout<<"全排列"<<num<<":";
for(int i=1;i<=m;i++){
cout.width(4);
cout<<list[i];
}
cout<<endl;
}
else{
for(int i=k;i<=m;i++){//4,5
swap(list[k],list[i]);//5,4
perm(list,k+1,m);//1,2,3,5,4
swap(list[k],list[i]);//4,5
}
}
}
int main(){
cout<<"*********全排列算法***************"<<endl;
cout<<"**********************************"<<endl;
int n,k,m;
cout<<"请输入你要输入的数组元素个数:";
cin>>n;
cout<<endl;
cout<<"---------------------------------------"<<endl;
cout<<"请按提示输入数据===》:"<<endl;
for(int i=1;i<=n;i++){
cout<<"请输入第"<<i<<"个数:";
cin>>arr[i];
cout<<endl;
}
cout<<"数据输入完毕!";
cout<<"---------------------"<<endl;
cout<<"全排列的起始位置(>=1):";
cin>>k;
cout<<"全排列的终止位置(<)"<<MAX<<":";
cin>>m;
cout<<"----------------------------------"<<endl;
cout<<"操作完成,全排列结果如下:"<<endl;
cout<<"********************************"<<endl;
cout<<"全排列如下:"<<endl;
perm(arr,k,m);
cout<<"全排列个数为:"<<num<<endl;
return 0;
}