這是一道深搜題目!問題的關鍵是在剪枝。
下面我們對問題進行分析:
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 #include4using
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...