全排列 模板和例題

2022-05-08 08:36:32 字數 1899 閱讀 6650

1.直接使用 stl 中的 next_permutation 實現全排列

#includeusing

namespace

std;

intmain()

; sort(a,a+4

);

do printf("\n

");}

while(next_permutation(a,a+4

));}

2.遞迴求全排列

n 個元素的全排列 =(不斷將每個元素作為字首)+(剩下 n-1 個元素的全排列)

結束:只有乙個元素的全排列

#includeusing

namespace

std;

int a[4] = ;

void swap(int* x,int*y)

int perm(int begin, int

end)

printf("\n

");}

else

} }int

main()

例1:五星填數

在五星圖案節點填上數字:1~12,不包括7和11。要求每條直線上數字和相等。

如圖就是乙個恰當的填法。請搜尋所有可能的填法有多少種。

注意:旋轉或映象後相同的算同一種填法。

思路:第一步:寫出10個數的全排列。

第二步:判斷每個直線上的數字和是不是相等。

第三步:剔除旋轉、映象相同的解。

旋**乙個解旋轉5次,都相同;

映象:需再除以 2 。

所以最後結果應該除以 10 。

#includeusing

namespace

std;

intmain()

;

int num = 0

;

do }

while(next_permutation(star+1, star+11

)); printf("%d

", num/10);}

例2:列印 n 個數中任意 m 個數的全排列

只需修改遞迴程式中的乙個地方即可。

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

namespace

std;

int a[5] = ;

void print_set(int n, int

m)

if(num ==m)

}printf("\n

");}

}}int

main()

借鑑部落格:> ^ ~ %" href="" target="_blank">

全排列模板 非模板

一 模板 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 ...