回溯法 n後問題

2021-07-31 20:53:00 字數 755 閱讀 9738

n後問題

1.問題描述:

在n×n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一斜線上的棋子。n後問題等價於在n×n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。

2.演算法設計:

用n元組x[1:n]表示n後問題的解。其中,x[i]表示皇后i放在棋盤的第i行的第x[i]列。由於不允許將2個皇后放在同一列上,所以解向量中的x[i]互不相同。2個皇后不能放在同一斜線上時問題的隱約束。

若兩個皇后放置的位置分別是(i,j)和(k,l),且i-j=k-l或i+j=k+l,則說明這2個皇后處於同一斜線上。由此可知,只要|i-k|=|j-l|成立,就表明2個皇后處於同一斜線上。

用回溯法解n後問題時,用完全n叉樹表示解空間。可行性約束place剪去不滿足行、列和斜線約束的子樹。在演算法backtrack中,當i>n時,演算法搜尋至葉結點,得到乙個新的n皇后互不攻擊放置方案,當前已找到的可行方案數sum增1。

源**:

#include "stdafx.h"

#includeusing namespace std;

class queen ;

bool queen::place(int k)

void queen::backtrack(int t)

else }}

int nqueen(int n)

void main()

n後問題 回溯法

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

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列下標相等的數,即可,若存...