上次上課老師講了全排列演算法,現在剛剛看自己的寫的全排列演算法,看了好一會才看懂。。。。
應該是自己理解的不夠徹底
所以今天徹徹底底的來分析一下
先看圖:
思路:先固定乙個字元,然後將固定的字元與它後面的每乙個進行交換,一直遞迴下去,直到固定的字元後面只有乙個字元
我們先看看圖,框外面的字元是被固定的字元,框裡面的字元的沒有被固定的字元,具體做法就是每次將框裡面的第乙個字元與框裡面的字元交換(框裡面第乙個與第乙個交換,第乙個與第2個交換,第乙個與第3個交換.........第1個與第n個交換),直到框裡面只剩下乙個字元的時候,輸出此時的字元排列,但是輸出之後又要將字元的位置還原會來。。。(我覺得我講的有點不太好理解),所以外面現在直接來對圖分析吧
假設有abc三個字元,求全排列
看第0層,abc三個字元都在框裡面,所以將第乙個字元a和第乙個字元,第二個字元,第三個字元交換得到:abc,bac,cba,這三個字串構成了第1層,現在第一層的框裡面還有兩個字元,所以外面應該繼續遞迴,直到框裡面還剩下乙個字元就輸出這個字串,所以第一層的abc字串bc還在框裡面,所以將b和b交換,將b和c交換,一共兩種情況,(框裡面第乙個與第乙個交換,第乙個與第2個交換,第乙個與第3個交換.........第1個與第n個交換,一共n種情況)
全排列可以看做固定前i位,對第i+1位之後的再進行全排列,比如固定第一位,後面跟著n-1位的全排列。那麼解決n-1位元素的全排列就能解決n位元素的全排列了
**如下:
#include#include有任何不足錯誤的地方歡迎拍磚指正哦!!!!!int k=0
;char a[100
];long
long count=0;//
全排列個數的計數
void s(char a,int i,int k)//
將第i個字元和第k個字元交換
void f(char a,int k,int
n)
inti;
for(i=k;i)
}int
main()
技術在於分享
遞迴求解全排列問題
遞迴求解全排列問題 求解思想 排列中每乙個數字,都有一次當最前單一綴的機會,例如 排列陣列 a 1.當a中只有1個數字的時候,a 1 則只有1個數字做單一字首和字尾,則只有一種 1!1 可能 a1,直接輸出 2.當a中只有2個數字的時候,a 2 則a1,a2分別有一次機會做單一字首的機會,2!2 3...
全排列問題(遞迴呼叫)
題目如下 給乙個數字n,求1到n之間的數字的全排列。input 多組輸入,以eof結束 1 n 8 output 對於每個n,輸出1到n的全排列 按字典序輸出全排列 每個排列一行 相鄰兩個數字之間隔乙個空格 sample input sample output 1 2 3 1 3 2 2 1 3 2...
遞迴之全排列問題
一 問題 設計乙個遞迴演算法生成n個元素的全排列。二 思路 其實就是將整個序列a 的每個元素一一提到序列a首個位置即a i 三 include using namespace std void swap int a,int b list k m 的所有排列,k是序列首下標,m是序列最後乙個下標 vo...