青藤 801 經典 N皇后問題

2021-10-13 20:04:53 字數 1252 閱讀 2430

題目描述

在一張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 函式的遞迴發生在...