全排列問題

2022-09-12 19:00:28 字數 685 閱讀 9233

這個問題很簡單,就是給出乙個數列,求這個數列有多少種排列方法(最簡單的排列組合種的排列)。

那要實現這個問題,肯定會在腦子中想到兩種方法:萬能的stl**和手寫dfs

開局一條分割線,就問你服不服?(滑稽

關於stl,我們需要知道在標頭檔案中有這樣乙個神奇的東西:next_permutation函式。

這個函式的原型可以理解為bool next_permutation(begin,end);,其中begin是這個陣列第乙個數的下標,end是這個陣列種最後乙個數的下標。

這個函式就可以直接把我們輸入的陣列以全排列的形式輸出出來,**如下:

do

puts("");

} while (next_permutation(a+1,a+1+n)); // 函式原型

當然,因為是stl**,所以在時間和空間上會有所妥協。因此,生成next_permutation函式的時間複雜度為o(n),一共有o(n!)個排列,總的時間複雜度可能為o(n*n!)。對於給出的例題,這個複雜度是完全可以接受的,但是對於其他題目可能需要設計合理的剪枝演算法才可行。

下一步,我們就考慮手寫搜尋函式實現全排列。

開局又一條分割線,就問你服不服?(orz滑稽

全排列問題

一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...

全排列問題

題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...

全排列問題

全排列就是從第乙個數字起 每個數分別與它後面的數字交換 用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba。第一種方法 用遞迴 不包含有重複數字或字元出現的情況 void swap char a,...