《劍指offer》第28題 全排列問題及擴充套件

2021-09-25 09:12:51 字數 1658 閱讀 1582

題目:輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab、cba。

題目1:輸入乙個含有8個陣列的陣列,判斷有沒有可能把這8個數字分別放到正方體的8個定點上,使得正方體上三組相對的面上的4個頂點的和都相等。如圖所示:(其實圖只是個幌子,壞的很,本來不考慮這個圖也許還能和組合聯絡在一起)

這相當於先得到a1,a2,a3,a4,a5,a6,a7和a8這8個數字的所有排列,然後判斷有沒有某乙個的裴烈符合題目給定的條件,即a1+a2+a3+a4 = a5+a6+a7+a8, a1+a3+a5+a7 = a2+a4+a6+a8, 並且a1+a2+a5+a6 = a3+a4+a7+a8。

也就是說要在全排列中找到一組以某個定點出發組成的三組相對面的每四個定點的和相等的情況,就得到了符合要求的組合,如果全排列結束也沒有找到符合要求的結果,那麼這組數字就是不符合題目要求的。

接下來分析**流程:

1.確定函式及引數:還是排列問題就叫permutation吧,進去的時候應該會有陣列和陣列元素個數(int* a, int n),返回值的話可以是個bool型別的值。

3.函式內部設計2:關於停止條件:如果搜尋到了最後乙個元素位置,也就是乙個全排列已經產生:即從pbegin到a的起始位置,就需要判斷3對相對的4個頂點的和是否滿足條件,如果每組對應相等,那麼就將查詢的結果改為true,也就是說,需要乙個全域性的變數,當然main裡的臨時變數作為引數傳遞也是可以的。

然後就可以書寫**了,感覺我的fenix應該是最詳細的了,那倫家要申請乙個贊,灰常感謝thanks♪(・ω・)ノ:

#include using namespace std;

bool result = false;

void permutation(int* a, int pbegin, int n)

return ;

}for(int i = pbegin; i != n; i++)

}}void permutation(int* a, int n)

permutation(a, 0, n);

cout<題目2:8皇后問題

題目:在 8 × 8 的西洋棋上擺放8個皇后,使其不能相互共計,即任意兩個皇后不得處在同一行、同一列或者同一對角線上。請問總共有多少種符合條件的擺法?

分析:由於 8 個皇后的任意兩個不能處在同一行,那麼可定是每個皇后佔據一行。於是我們可以定義乙個陣列columnindex[8],陣列中第 i 個數字表示位於第i行的皇后的列號,即 index 代表行號,內容表示列號。先把columnindex的8個數字分別用0 ~ 7 初始化,接下來就是對陣列columnindex的 8 個陣列分別用不同的數字初始化陣列,所以,任意兩個皇后肯定不同列。我們只需判斷每乙個排列對應的8個皇后是不是在同一對角線上,也就是對於陣列的兩個下標 i 和 j ,是不是滿足 i - j == columnindex[i] - columnindex[j] 或者 j - i == columnindex[i] - columnindex[j]。

其實和上題基本相似,但是遞迴結束後的條件有所變化。

全排列問題 劍指offer28

求全排列的步驟 兩步,無重複字元的情況 1.求出所有可能在第乙個位置的陣列,即吧第乙個字元和後面的所有字元交換。2.固定第乙個字元,求後面所有字元的全排列。第2步中的全排列求解用到遞迴。此時,仍把後面的所有字元分成兩部分,後面字元的第乙個字元,以及這個字元之後的所有字元。然後把第乙個字元注意和他後面...

全排列問題 劍指offer28

求全排列的步驟 兩步,無重複字元的情況 1.求出所有可能在第乙個位置的陣列,即吧第乙個字元和後面的所有字元交換。2.固定第乙個字元,求後面所有字元的全排列。第2步中的全排列求解用到遞迴。此時,仍把後面的所有字元分成兩部分,後面字元的第乙個字元,以及這個字元之後的所有字元。然後把第乙個字元注意和他後面...

劍指offer第28題擴充套件題

輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a b c ab ac bc abc。總的思路類似前面幾篇部落格裡寫的,不過前面的部落格裡面ab,ba算不一樣的,這裡其實就是3選1,3選2,3選3,那現在就考慮n選m怎麼取。假設有n個元素,要選m個,總共的排列數為f n...