problem description
在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。
你的任務是,對於給定的n,求出有多少種合法的放置方法。
input
共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。
output
共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。
sample input
1850
sample output
19210
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。當且僅當 ...