軟體設計師演算法之回溯法 全排列

2021-08-08 08:14:39 字數 995 閱讀 7915

全排列大家都知道。這裡是通過最普遍的全排列,來理解回溯法的乙個實現。最普通的全排列,比如a b c 三個字母,每個字母只能用一次,來進行排列,共有6種結果,比如abc,acd等。這個全排列結果和我們現實生活中n個人排隊的可能性的結果是一樣的。

我這邊的思路就是按照位置來進行,比如n個元素,首先第1個位置(索引為0)可以有n種選擇,那麼第二個位置有n-1種選擇,倒數第二個位置有2種選擇,最後乙個位置只能有1種選擇。

當我們完成一次排列之後,回溯,首先回溯到倒數第二個位置,倒數第二個位置有2種選擇,第一次排列已經用了其中乙個選擇,回溯之後,我們採用另外乙個選擇,最後乙個位置也有乙個選擇,這樣又完成了一次排列。

完成第2個排列之後,我們再次回溯到倒數第二個位置,發現2種選擇都試過了,那麼回溯到倒數第3個位置,倒數第3個位置有3種選擇,各個選擇我們都用一遍之後,繼續回溯到倒數第4個,如此回溯直到到第1個位置(索引為0,有n個選擇)。n個選擇都用一遍,直到把所有的排列情況都嘗試了一遍。

明顯可以看出,整個回溯過程,其實就是圖的深度優先搜尋dfs。

ok,下面是實現的**:

#define str_size 6

char g_data[str_size] = ;

char g_output[str_size] = ;

unsigned int g_fullpermutationcount = 0;

void fullpermutationtest()

void printfullpermutation()

{ printf("one of result:\r\n");

for(int i=0;i

測試結果如下:

當然,實際情況的排列可能會有出現重複的字母(比如2個a,或者3個b),那麼排列就不一樣了。但是還是可以通過如上的回溯稍加變化來實現。

軟體設計師演算法之回溯法 8皇后問題

8皇后問題,我想it人士應該基本都聽過了。特別是會下西洋棋的。規則很簡單,每乙個皇后會攻擊每一條線的其它皇后,因此要確保每一條線上 包括直線和對角斜線 只能存在乙個皇后。8皇后問題我一直沒有編寫過 去實現。今天正好補上。如下是實現 define max row 8 define max column...

軟考 軟體設計師 演算法

分類 插入排序 直接插入,希爾排序 選擇排序 簡單選擇,堆排序 交換排序 氣泡排序,快速排序 歸併排序 基數排序 直接插入排序 每一步將乙個待排序列根據乙個元素值的大小插入已經排好序的那部分去。首個元素歸入已排好序列 第二個元素跟已排好序列比較,放於那位子,後續元素遞推。希爾排序 對直接插入排序的改...

軟體設計師演算法之分治法 快速排序

快速排序也是通過分治法。它的思路是先確定第乙個元素的位置,該位置之前的元素全部小於第乙個元素,該位置之後的元素全部大於該元素。確定位置後,把陣列分為了前後2部分,對這2部分執行遞迴操作,直達遞迴到陣列為1的大小,即遞迴到了最底層,即完成了排序過程。比如陣列 5,3,8,1,23,14,首先選取第乙個...