排列组合之排列问题的算法实现

    技术2022-05-18  46

    声明:本算法参考了网上其它的一些算法,在此表示感谢,由于是时隔很久的一个总结,相关参考链接已经忘了,故此处没有给出参考页面,敬请见谅~~~

     

    排列问题:

    问题:

    给定两个数nr,求出从1n中选出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; }

     

     


    最新回复(0)