声明:本算法参考了网上其它的一些算法,在此表示感谢,由于是时隔很久的一个总结,相关参考链接已经忘了,故此处没有给出参考页面,敬请见谅~~~
排列问题:
问题:
给定两个数n和r,求出从1到n中选出r个数的排列
例如:n=4,r=2
结果:1,2 1,3 1,4 2,1 2,3 2,4 3,1 3,2 3,4 4,1 4,2 4,3
注意:如果你需要对一个数组内容进行排列,你可以转换成上面的形式,先对数组下标进行排列,然后按照下标还原成数组内容,故任何排列都可以转换成上面的形式,本算法具有通用性。
#include <iostream> using namespace std; const int MAXSIZE = 100; //用来保存一种排列的中间结果 int p[MAXSIZE]; //用来标识哪些数已经被使用了 int used[MAXSIZE]; /* * 采用递归求取n个数中,选r个数的排列 */ void Permute(int n, int r, int pos) { //如果已近到了最后一个元素,可以输出一种排列 if(pos == r) { for(int i=0; i<r; i++) { cout << p[i] << " "; } cout << endl; return; } for(int i=0; i<n; i++) { //如果该数没有被使用 if(!used[i]) { //标识该数已经被使用 used[i] = 1; //保存当前搜索的数到数组中 p[pos] = i+1; //递归求取下一个数 Permute(n, r, pos+1); //恢复标识的数,以供下一种情况使用 used[i]--; } } } int main() { memset(used, 0, MAXSIZE); Permute(5, 3, 0); system("pause"); return 0; }