输出数组全排列
-
字符串的排列組合問題:http://blog.csdn.net/wuzhekai1985/article/details/6643127
-
輸出全排列(遞歸&非遞歸)
-
http://blog.csdn.net/hackbuteer1/article/details/7462447
-
從數組中取出n個元素的所有組合(遞歸實現)
-
之前一直沒有實現過,今天理解一下
?- 參考
1.全排列:用遞歸的思想求出全排列 #include "stdafx.h" #include <iostream> using namespace std;void swap(int &a,int &b)//交換連個元素 {int tem;tem = a;a = b;b = tem;}void cal(int *a,int first,int length){if(first == length)//如果遞歸到深層時,到最后交換的元素即時最后一個元素時就打印出來 {for(int i = 0; i <= length; i++)cout<<a[i]<<" ";cout<<endl;}else{for(int i = first; i <= length; i++){//循環遍歷使得當前位置后邊的每一個元素都和當前深度的第一個元素交換一次swap(a[first],a[i]);//使得與第一個元素交換cal(a,first+1,length);//深入遞歸,此時已確定前邊的元素,處理后邊子序列的全排列形式。swap(a[first],a[i]);//恢復交換之前的狀態 }}}int main(){int a[6] = {1,2,3,4,5,6};cal(a,0,5);return 0;}2.借助于上面的求出全排列的方法,求組合的時候只是在遞歸到低時輸出的不一樣,這里只輸出組合個數的元素: #include "stdafx.h" #include <iostream> using namespace std;void swap(int &a,int &b)//交換連個元素 {int tem;tem = a;a = b;b = tem;}void cal(int *a,int first,int length,int r){if(first == length)//如果遞歸到深層時,到最后交換的元素即時最后一個元素時就打印出來 {for(int i = 0; i <= r; i++)cout<<a[i]<<" "; //bug 錯誤的:如果12345;則n(5,2):(12345,12435,12354...等輸出前面的都是一樣的)cout<<endl;}else{for(int i = first; i <= length; i++){//循環遍歷使得當前位置后邊的每一個元素都和當前深度的第一個元素交換一次swap(a[first],a[i]);//使得與第一個元素交換cal(a,first+1,length,r);//深入遞歸,此時已確定前邊的元素,處理后邊子序列的全排列形式。swap(a[first],a[i]);//恢復交換之前的狀態 }}}int main(){int a[6] = {1,2,3};cal(a,0,2,1);return 0;}?
總結
- 上一篇: 获取鼠标坐标
- 下一篇: 承担集团数万应用、研发人员日常工作,阿里