n後問題 回溯法

2021-07-08 15:03:28 字數 1193 閱讀 2683

一.問題描述:

在n*n格仔上放置n個皇后, 按照西洋棋規矩不可讓皇后相互攻擊, 即如何兩個皇后不放在同一列同一行同一斜線上.

二.演算法設計:

將問題轉化為逐行放置皇后,即第一次放第1行,第二次放第2行,依次類推放至第n行皇后則放置完畢,如此每次放置只需考慮皇后的列衝突和斜線衝突.因為每次皇后都在新的一行放置.假設陣列 x[i] 表示第i個皇后放的列數,如x[3] = 4; 表示第3個(第三行的)皇后放在第4列.

設第i行皇后放x[i]列,和第k行皇后放x[k]列,其中衝突情況有: 

列衝突, 即x[k] = x[i] 

斜線衝突,由於在n*n格仔,則若有兩個棋子屬於同一斜線,則兩棋子斜率為-1,可推出 | x[i]-x[k] | /| (i-k) |=1; 則 |i-k|= | (x[i]-x[k]) |

因此在此可以先定義檢驗函式bool place(int k),該函式檢驗第k行皇后與之前的所有皇后有沒有衝突,

函式**如下:

bool queen::place(int k)

三.解空間:

n後問題的解可以用一顆解空間樹表示,其中從根節點開始對樹進行深度優先搜尋,

從第乙個根節點開始搜尋,如果找到第n+1層,則所有n後放置完畢,解決方案sum++;

四.源程式**:

#include#includeusing namespace std;

class queen

;bool queen::place(int k)

}int nqueen(int n)

int main()

{ int n,s;//皇后個數,解決方案;

int t=4;

while(t--)

{ cout

s=nqueen(n);

cout五.結果示例:

由於遞迴回溯法時間複雜度高,超過12的皇后個數請慎用.如果基數過大,回溯法的優勢就不明顯了.

所以關於該演算法的改進還有另一種拉斯維加斯(las vegas)演算法,結合了隨機函式,提高了效率,今天先到這裡,明天接著寫.

參考資料:《計算機演算法設計與分析》 (第四版) 電子工業出版社

回溯法 n後問題

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

n後問題 回溯法

問題描述 在n n的棋盤上放置彼此不受攻擊的n個皇后。按西洋棋的規則,皇后可以與之處在同一行或者同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n皇后,任何2個皇后不放在同一行或同一列的斜線上。演算法設計 i k j l 成立,就說明2個皇后在同一條斜線上。可以設計乙個place函式,...

回溯法 n後問題

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