n皇后問題(回溯)

2021-08-02 17:02:00 字數 1471 閱讀 8711

problem description

在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

你的任務是,對於給定的n,求出有多少種合法的放置方法。

input

共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。

output

共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。

sample input

185

0

sample output

1

9210

author

cgf

source

2008 hznu programming contest

recommend

lcy

首先看乙個8皇后問題!

【演算法分析】

顯然問題的關鍵在於如何判定某個皇后所在的行、列、斜線上是否有別的皇后;可以從矩陣的特點上找到規律,如果在同一行,則行號相同;如果在同一列上,則列號相同;如果同在/ 斜線上的行列值之和相同;如果同在\ 斜線上的行列值之差相同;從下圖可驗證: 

| /

\ |

/ \ |

- -- ▲

- -- -

/| \

/ | \/|

\考慮每行有且僅有乙個皇后,設一維陣列a[1..8]表示皇后的放置:第i行皇后放在第j列,用a[i]=j來表示,即下標是行數,內容是列數。例如:a[3]=5就表示第3個皇后在第3行第5列上。

判斷皇后是否安全,即檢查同一列、同一對角線是否已有皇后,建立標誌陣列b[1..8]控制同一列只能有乙個皇后,若兩皇后在同一對角線上,則其行列座標之和或行列座標之差相等,故亦可建立標誌陣列c[1..16]、d[-7..7]控制同一對角線上只能有乙個皇后。

如果斜線不分方向,則同一斜線上兩皇后的行號之差的絕對值與列號之差的絕對值相同。在這種方式下,要表示兩個皇后i和j不在同一列或斜線上的條件可以描述為:a[i]<>a[j] and abs(i-j)<>abs(a[i]-a[j])

**:#include#include#include#includeusing namespace std;

bool d[100]=,b[100]=,c[100]=;

int sum=0,a[100];

int search(int);

int print();

int main()

nt search(int i)

}int print()

else

{for(i=1;i<=n;++i)

{map1[k]=i;

flag=1;

for(j=1;j>m,m)

{cout<

回溯 n皇后問題

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

回溯 N皇后問題

會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2 b8,其中bi為相應擺法中第i行皇后所處的列數。已經知道8皇后...

回溯經典 n皇后問題

題目大意 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 ...