回溯 n皇后問題 收藏

2021-08-24 19:36:15 字數 1540 閱讀 7375

思想:

用回溯方法求解,首先要分析問題的求解空間。可用一棵n叉樹表示這個問題的求解空間,在回溯遍歷這個課二叉樹的過程中形成合理的解。

對於這棵n叉樹,列序號i(0~n-1)是它的孩子,而每個孩子都有深度為n的子樹(包括自身),這些子樹的層次是n個皇后(也代表每個皇后的行序號,因為不同的皇后肯定不在同一行)。於是,遍歷這個n叉樹的每個孩子結點到葉子節點便得到乙個合理解。遍歷時,先從第乙個孩子(第一行)開始遍歷,深度遍歷這個孩子子樹,直到找到(1)乙個合理解或者(2)剪去不存在合理解的分枝。對於(1)表明已經遍歷到了葉子節點,亦即所有的皇后都找到了乙個合理的位置,對於(2)表明在某個層次的皇后節點不能找到乙個合理位置,於是停止深度遍歷,將此分枝剪去。不管對於哪種情況,此時要向上層回溯,繼續探索合理的解。直到整個n叉樹都遍歷完。

比如對於4個皇后的情況,首先讓第乙個皇后佔據x[0][0](第一行第一列),然後讓第二個皇后在第二行尋找合適的位置x[1][2](第二行,第3列),第三個皇后在第三行尋找合適的位置,此時第三個皇后已經不能找到合適位置,於是將此分枝剪去。回溯到第二個皇后(第二行),探索新的位置,此時對於第二個皇后已經不能找到合理位置。回溯到第乙個皇后(第一行),探索新的位置。此時,讓第乙個皇后佔據第一行第二列x[0][1],依次回溯,直到第乙個皇后的所有列都試探完畢,也就遍歷完了n叉樹。

下面給出遞迴和非遞迴的實現:

view plaincopy to clipboardprint?

遞迴實現:

1 #include

2 #include

3 #include

4 #define n 8

5 6 int x[n];//x[i]代表第i個皇后的列序號,行序號是下標i

7 int sum;

8 bool place(int i)

9 {

10 int j=0;

11 for(j =0;jn-1)

20 sum++;

21 else

22 {

23 for(i=0;i

2 #include

3 #include

4 #define n 8

5 6 int x[n];//x[i]代表第i個皇后的列序號,行序號是下標i

7 int sum;

8 bool place(int i)

9 {10 int j=0;

11 for(j =0;jn-1)

20 sum++;

21 else

22 {

23 for(i=0;i

2 #include

3 #define n 8

4 5 int x[n];

6 int sum;

7 bool place(int i)

8 {

9 int j=0;

10 for(j =0;j=0)

20 {

21 x[k]+=1;//此時對於第k個皇后,列號向右移動,表示,當回溯到這一層時0~x[k]-1已經探索過了,接著往後探索

22 while(x[k]

回溯 n皇后問題 收藏

思想 用回溯方法求解,首先要分析問題的求解空間。可用一棵n叉樹表示這個問題的求解空間,在回溯遍歷這個課二叉樹的過程中形成合理的解。對於這棵n叉樹,列序號i 0 n 1 是它的孩子,而每個孩子都有深度為n的子樹 包括自身 這些子樹的層次是n個皇后 也代表每個皇后的行序號,因為不同的皇后肯定不在同一行 ...

回溯 n皇后問題

思想 用回溯方法求解,首先要分析問題的求解空間。可用一棵n叉樹表示這個問題的求解空間,在回溯遍歷這個課二叉樹的過程中形成合理的解。對於這棵n叉樹,列序號i 0 n 1 是它的孩子,而每個孩子都有深度為n的子樹 包括自身 這些子樹的層次是n個皇后 也代表每個皇后的行序號,因為不同的皇后肯定不在同一行 ...

n皇后問題(回溯)

problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如...