HDU 2553 N皇后問題(詳細題解)

2022-05-18 06:19:37 字數 1221 閱讀 6684

這是一道深搜題目!問題的關鍵是在剪枝。

下面我們對問題進行分析:

1.一行只能放乙個皇后,所以我們一旦確定此處可以放皇后,那麼該行就只能放乙個皇后,下面的就不要再搜了。

2.每一列只能放乙個皇后,所以我們下次搜尋就不要再搜已經放過的皇后了。

3.斜的45°線也只能放乙個。

綜上如何才能最快速的確定一列和45°是否用過這個是個關鍵步驟,一旦此步驟確定我們就可以很快的進行搜尋了。

我們用三個陣列來儲存他的每乙個狀態及(三個方向 ↖ ↑ ↗)

但是如果我們儲存↑(每一列方向上的皇后)是非常容易儲存的 但是儲存( 這兩個方向上的狀態就不容易了↖ ↗)

再分析,在這個(↖)方向上的資料的行和列有什麼特點

0  1  2  3   4

-1  0  1  2  3

-2 -1  0  1  2

-3 -2 -1  0  1

-4 -3 -2 -1  0 

將此表列出我們就應該知道在(↖)方向上的資料的行和列的特點了,及   在 (↖)方向上  列 - 行 的差是相等的。

假如我們用陣列儲存負數肯定是不行的, 所以我們要加上 n,讓他變為非負.

再分析,在這個( ↗)方向上的資料的行和列有什麼特點

0 1 2 3 4

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7

將此表列出我們就應該知道在(↗)方向上的資料的行和列的特點了,及   在 (↗)方向上  列 + 行 的和是相等的。

知道資料怎麼處理就可以解決問題了。

1 #include2 #include3 #include4

using

namespace

std; 5

int vis[3][50], p[15];//

三個方向 ↖↑↗在此三個方向都不能有皇后

6int

n, sum; 7

8void dfs(int

row); 9

10int

main()

1119

while(scanf("

%d",&n), n)

2023

return0;

24}2526

void dfs(int

row)

2734

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

3542

}43 }

HDU 2553 N皇后問題

題目 problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數...

HDU 2553 N皇后問題

復健。一題經典的回溯法,要打表。include define max n 11 int n,res int c max n ans max n void dfs int cur if flag dfs cur 1 int main int m while scanf d m m printf d n...

HDU 2553 N皇后問題

題目資訊 一種非常有用的二進位制優化方法 hdu2553n皇后問題 problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。in...