全排列遞迴

2021-10-10 11:12:23 字數 1634 閱讀 2808

輸出1~n這n個數的全排列

從遞迴角度去想,把問題分為若干個子問題:「輸出以1開頭的全排列」,「輸出以2開頭的全排列」…「輸出以n為開頭的全排列」。於是不妨設定乙個陣列p,用來存放當前排列,在設定乙個雜湊陣列hashtable,其中hashtable[x]當整數x已經在p中時為true。

**如下

#include

using

namespace std;

const

int maxn =11;

int p[maxn]

;//存放全排列

bool hashtable[maxn]=;

//記錄整數x是否在p中

void

arrangement

(int index,

int n)

cout

for(

int x =

1;x<=n;x++)}

}int

main()

n皇后問題

解決了全排列問題後,我們可以延伸到n皇后問題。

**如下

#include

using

namespace std;

const

int maxn =11;

int p[maxn]

;bool hashtable[maxn]=;

static

int ncount =0;

void

arrangement

(int index,

int n)}if

(flag)

}for

(int x =

1;x<=n;x++)}

}int

main()

但判斷每一種方案是否合法做法非常樸素。事實上,經思考後發現,當放置一部分皇后後,下乙個無論放在**都無法使方案合法,此時就可以將此方案槍斃掉。

一般來說,如果達到遞迴邊界前的某層,由於一些事實已經不需要任何乙個子問題遞迴,就可以直接返回上一層,這種方法就叫做回溯法

n皇后回溯**

#include

using

namespace std;

const

int maxn =11;

int p[maxn]

;bool hashtable[maxn]=;

static

int ncount =0;

void

arrangement

(int index,

int n)

// }

// if(flag)

// }

if(index == n+1)

for(

int x =

1;x<=n;x++)}

if(flag)}}

}int

main()

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

遞迴全排列

遞迴思想,用重複的簡單過程實現乙個複雜的專案,遞迴要素有 1 遞迴的每一層,規模要逐漸縮小 2 遞迴必須有出口,一般每個遞迴函式一開始,是判斷遞迴成立的條件 3 遞迴包括遞進過程和返回過程 4 要注意遞迴實現次數,一般在呼叫遞迴函式前加上遞迴重複條件 常見的結構是 遞迴函式 if 條件成立,例如規模...

全排列(遞迴)

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