本文主要是介绍整数全排列(旋转法,next_permutation),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
读了《C语言名题精选百则技巧篇》中的整数全排列,里面的算法是多样丰富的。看了旋转的基本思路和已经知道的最易用的next_permutation(),自己把两者都实现并且运行了一遍。只有不断学习,观察,猜想,推敲,实践才有可能弄懂算法的奥义。两种方式都产生相同数目的排列,但是次序是不同的。
旋转:
#include <iostream>
#include<cstdio>
using namespace std;
int A[5]={1,2,3,4,5};
void show(){for(int i=0;i<5;i++){printf("%d ",A[i]);}cout<<endl;
}
void rotate(int dex){int t=A[dex],i;for(i=dex+1;i<5;i++){A[i-1]=A[i];}A[4]=t;
}
int main(int argc, char *argv[]) {int dex=0,index=0,sum=0;while(dex<4){rotate(index);show();sum++;dex=index;while(A[dex]==dex+1&&dex!=4){dex++;rotate(dex);}}cout<<"sum= "<<sum<<endl;return 0;
}
next_permutation():
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int A[5]={1,2,3,4,5};
void show(){for(int i=0;i<5;i++){printf("%d ",A[i]);}cout<<endl;
}
int main(){int sum=0;do{show();sum++;}while(next_permutation(A,A+5));cout<<"sum= "<<sum<<endl;return 0;
}
这篇关于整数全排列(旋转法,next_permutation)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!