运行结果:
代码参考:
/* 全排列问题,即一个数组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; }
Nearth==>分治策略001/全排列算法
最新推荐文章于 2020-02-26 12:01:34 发布