題目描述
在一張nn的西洋棋棋盤上,放置n個皇后,使得所有皇后都無法互相直接攻擊得到,(皇后可以直接攻擊到她所在的橫行,數列,斜方向上的棋子),現在輸入乙個整數n,表示在的nn棋盤上放n個皇后,請輸出共有多少種使得所有皇后都無法互相直接攻擊得到的方案數。 例如下面這樣的擺法,是4皇后的乙個解 (1代表有皇后,0代表沒有)
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
輸入格式
乙個整數n
輸出格式
能使得在n*n的西洋棋棋盤上放置n個皇后,並且所有皇后都無法互相直接攻擊得到的方案數
思路先看斜對角的判斷方法:
很容易發現當queen的x與y之和與前面相等時,可以互相吃
也很容易發現當queen的x與y之差與前面相等時,可以互相吃。
有人就掉入了這個坑,寫下了:
if( queen1 x與y的絕對值== queen2 x與y的絕對值) 放置下一列皇后;
看上去沒錯,看下乙個樣例
好像也滿足上面這個條件,但事實上他們不可互相吃。
所以,條件應改為:
if(queen1 x-y == queen2 x-y) 放置下一列皇后;
此時是必然的對的,可自己實踐。
貼**:
#include
#include
using
namespace std;
int queens, pq[20]
;bool vcol[20]
;int ans;
bool
rep(
int n)
}return0;
}void
dfs(
int d)
for(
int i =
1; i <= queens; i++)}
}int
main()
回溯經典 n皇后問題
題目大意 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 ...
N皇后問題(經典DFS)
description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結...
經典遞迴 N皇后問題
用來存放皇后,轉換為二維矩陣,元素座標為 i,q i int n 4 void nqueen int k int main void nqueen int k for int i 0 i n i if j k 首先盯著第二個 for loop 看 for int i 0 i n i 函式的遞迴發生在...