1.直接使用 stl 中的 next_permutation 實現全排列
#includeusing2.遞迴求全排列namespace
std;
intmain()
; sort(a,a+4
);
do printf("\n
");}
while(next_permutation(a,a+4
));}
n 個元素的全排列 =(不斷將每個元素作為字首)+(剩下 n-1 個元素的全排列)
結束:只有乙個元素的全排列
#includeusing例1:五星填數namespace
std;
int a[4] = ;
void swap(int* x,int*y)
int perm(int begin, int
end)
printf("\n
");}
else
} }int
main()
在五星圖案節點填上數字:1~12,不包括7和11。要求每條直線上數字和相等。
如圖就是乙個恰當的填法。請搜尋所有可能的填法有多少種。
注意:旋轉或映象後相同的算同一種填法。
思路:第一步:寫出10個數的全排列。
第二步:判斷每個直線上的數字和是不是相等。
第三步:剔除旋轉、映象相同的解。
旋**乙個解旋轉5次,都相同;
映象:需再除以 2 。
所以最後結果應該除以 10 。
#includeusing例2:列印 n 個數中任意 m 個數的全排列namespace
std;
intmain()
;
int num = 0
;
do }
while(next_permutation(star+1, star+11
)); printf("%d
", num/10);}
只需修改遞迴程式中的乙個地方即可。
if(begin == m)例3:列印 n 個數中任意 m 個數的組合
二進位制法求子集:乙個二進位制數對應乙個子集,二進位制數中的每個 1 ,都對應了集合中的某個元素。
如何判斷二進位制數中 1 的個數?
k = k & (k - 1) 能消除二進位制數 k 的最後乙個 1。
例如:7 的二進位制是 111
111 & (111 - 1) = 111 & 110 = 110
110 & (110 - 1) = 110 & 101 = 100
100 & (100 - 1) = 100 & 011 = 000
#includeusing借鑑部落格:> ^ ~ %" href="" target="_blank">namespace
std;
int a[5] = ;
void print_set(int n, int
m)
if(num ==m)
}printf("\n
");}
}}int
main()
全排列模板 非模板
一 模板 c 的algorithm庫裡面有乙個函式next permutation start,end 作用就是求乙個排序的下乙個排列,可以遍歷全排列。注意如果不結束會一直迴圈,結果出現相同的排列。與之完全相反的函式還有prev permutation start,end 就是求乙個排序的上乙個排列...
全排列和去重全排列 遞迴實現
一 全排列的概念 根據360百科,我們知道從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。二 全排列的演算法 三 接下來我們學習第一種方法 遞迴實現全排列 include include using nam...
全排列 方法 全排列函式和遞迴和字典序
給你乙個字串,按字典序從小到大輸出這個字串的全排列 乙個由小寫字母組成的長度小於等於8的不含重複字元的字串 按字典序從小到大輸出這個字串的全排列 abcabc acbbac bcacab cbanext permutation函式 組合數學中經常用到排列,這裡介紹乙個計算序列全排列的函式 next ...