暴力搜尋專題小結 全排列及可重集排列生成演算法

2021-06-29 14:27:39 字數 963 閱讀 1181

(1)思路:按照遞迴的思想,初始化集合s中含有1~n所有元素。如果1~n的集合s為空,那麼輸出全排列;否則從小到大依次考慮每個元素i,在a的末尾新增i後,集合s變為s-。這裡我們不需要集合s,只需要利用乙個變數cur表示當前位要填的數即可。那麼a中沒有出現過的元素均可以選擇。

#define n 100

int a[n];

void print_permutation(int n, int*a, int cur)

else for (int i = 1; i <= n; i++)

if (ok)

}}

如果將上述問題改為「輸入陣列p,按照字典序輸出p中元素的所有排列」,注意這裡p陣列中的元素可以重複。那麼這時方法大體上類似於全排列,不過一些細節需要變動:

(1)首先要為p陣列排序,然後再呼叫print_permutation函式;

(2)由於p陣列中元素可以重複出現,因此要檢查在cur位之前有幾個元素p[i],假設有c1個,而p陣列中總共有c2個,那麼此時可以選擇;

(3)由於p陣列中元素可以重複出現,但列舉時不應當重複列舉,因此還要檢查p的第乙個元素和所有「與前乙個元素不相同」的元素。

#define n 100

int a[n];

int p[n];

void print_permutation(int n, int*p, int*a, int cur)

else for (int i = 0; i < n; i++)//列舉每乙個位置

if (!i || p[i] != p[i-1])//注意元素不能重複列舉

{ int c1 = 0, c2 = 0;

for (int j = 0; j < cur; j++)if (a[j] == p[i])c1++;

for (int j = 0; j < n; j++)if (p[j] == p[i])c2++;

if (c1

全排列 小結

從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。如1,2,3三個元素的全排列為 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 共3 2 1 6種 3!方法一 遞迴法1 遞迴 2 i...

演算法複習 全排列專題

一,全排列演算法 由於這部分十分重要,這裡再次做一下總結。更多詳細內容參考博文組合數學 全排列 二,演算法思想 這裡採用遞迴演算法,思路如下 固定第乙個數,然後處理後面n 1的全排列。第乙個數的可能性有n種,故採用for迴圈依次將後面n 1個數swap到前面,遞迴處理。處理完成之後再交換過來。例如 ...

全排列 DFS搜尋

給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小的排列在前面。...