這是一道深搜題目!問題的關鍵是在剪枝。
下面我們對問題進行分析:
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
將此表列出我們就應該知道在(↗)方向上的資料的行和列的特點了,及 在 (↗)方向上 列 + 行 的和是相等的。
知道資料怎麼處理就可以解決問題了。
下面附上參考**:
#include#include#includeusing namespace std;
int vis[3][50], p[15];//三個方向 ↖↑↗在此三個方向都不能有皇后
int n, sum;
void dfs(int row);
int main()
while(scanf("%d",&n), n)
return 0; }
void dfs(int row)
for(i = 1; i <= n; i++)}}
N皇后問題
include define maxqueens 20 define minqueens 4 enum bool typedef struct queendata queendata queendata queens maxqueens 1 int ncount init int init chec...
N皇后問題
採用遞迴回溯法 執行結果 輸入8 對於n皇后解的個數,參考 當n 16時,構造法給出解,參考poj 3239 一 當n mod 6 2 且 n mod 6 3時,有乙個解為 2,4,6,8,n,1,3,5,7,n 1 n為偶數 2,4,6,8,n 1,1,3,5,7,n n為奇數 上面序列第i個數為...
N皇后問題
問題 題目 於西洋棋的玩法,因為皇后所在的位置可以縱向 橫向 兩個斜向四個方向的 捕捉 所以8皇后問題就是要求如何布置8個皇后在8 8的棋盤上而使他們互相無法 捕捉 也就是說不存在兩個皇后同行或同列,或在同一斜線上。而n皇后問題就是如何布置n個皇后在n n棋盤裡使不存在兩個皇后在同行同列和同一斜線上...