n後問題 回溯法

2021-09-08 05:56:18 字數 1287 閱讀 1670

問題描述:

在n*n的棋盤上放置彼此不受攻擊的n個皇后。按西洋棋的規則,皇后可以與之處在同一行或者同一列或同一斜線上的棋子。

n後問題等價於在n*n格的棋盤上放置n皇后,任何2個皇后不放在同一行或同一列的斜線上。

演算法設計:

|i-k|=|j-l|成立,就說明2個皇后在同一條斜線上。可以設計乙個place函式,測試是否滿足這個條件。

1 當i>n時,演算法搜尋至葉節點,得到乙個新的n皇后互不攻擊放置方案,當前已找到的可行方案sum加1.

2 當i<=n時,當前擴充套件結點z是解空間中的內部結點。該結點有x[i]=1,2,3....n共n個兒子節點。

對當前擴充套件結點z的每個兒子節點,由place檢察其可行性。並以深度優先的方式遞迴地對可行子樹,或剪去不可行子樹。

演算法描述: 

#include #include 

using

namespace

std;

class

queen;

bool queen::place(int

k)void queen::backtrack(intt)}

int nqueen(int

n)int

main()

執行結果:

迭代回溯:

陣列x記錄了解空間樹中從根到當前擴充套件結點的路徑,這些資訊已包含了回溯法在回溯時所需要的資訊。利用陣列x所含的資訊,可將上述回溯法表示成非遞迴形式,進一步省去o(n)遞迴棧空間。

n後問題的非遞迴迭代回溯法backtrack可描述如下:

#include #include 

using

namespace

std;

class

queen;

bool queen::place(int

k)void queen::backtrack(void)//

......

else

k--;

}}int nqueen(int

n)int

main()

執行結果:

xingoo 閱讀(

...)

編輯收藏

n後問題 回溯法

一.問題描述 在n n格仔上放置n個皇后,按照西洋棋規矩不可讓皇后相互攻擊,即如何兩個皇后不放在同一列同一行同一斜線上.二.演算法設計 將問題轉化為逐行放置皇后,即第一次放第1行,第二次放第2行,依次類推放至第n行皇后則放置完畢,如此每次放置只需考慮皇后的列衝突和斜線衝突.因為每次皇后都在新的一行放...

回溯法 n後問題

n後問題 1.問題描述 在n n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。2.演算法設計 用n元組x 1 n 表示n後問題的解。其中,x i 表示皇...

回溯法 n後問題

題目 在乙個n n的棋盤中,放置n個皇后,要求同一行 同一列 同一對角線上不能存在兩個皇后,求放置皇后的策略。思路 將棋盤壓縮儲存為一維陣列ar n 陣列中第i個元素就是棋盤第i行的皇后位置。這樣就不存在行衝突的問題,至於列衝突,判斷當前ar陣列中是否存在與將要放置皇后的j列下標相等的數,即可,若存...