用三個陣列來儲存他的每乙個狀態及(三個方向 ↖ ↑ ↗)
利用行減列 得到以下數字 所以在同乙個主對角線上的 row-i是相同的 只需要標記vis[row-i+n]就知道在這主對角線時候已經有皇后了//+n是為了防止負數
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
#include #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++)}}
選自
首先uplimit是(1 << n) - 1,如果n是8的話uplimit就是255,看做二進位制就是11111111。聰明的人一看就知道了,這裡每一位就代表乙個皇后。
而r代表每一列能放與否,如10001110就代表第2、3、4、8個能放。
所以開始乙個if來判斷皇后放齊了沒。如果齊了,顯然r也要等於11111111。
還有ld和rd分別是對角線的各位能放與否。
我們來看看下圖(from matrix67):
假設我們已經遞迴到第三行了(左圖),這裡可以看出r為101010也就是說(第三行的)第
二、四、六個格仔可以放。ld是100100(藍色線),(第三行的)第
二、三、五、六個格仔可以放,rd為000111,。 //當初看得我一臉懵
之後r|rl|rd 或運算 則有0的位就可以放a
col|lowbit//下一行的r,((lowbit|rl)>>1)下一行的rl (((lowbit|rd)<<1) 下一行的rd &high//保證在資料範圍內 可以截掉 why?
col|lowbit 其實就是將r中的剛剛放a的位置 0變為1
lowbit|rl 也是 將rl中的剛剛放a的位置 0變為1 但還要1 why?
#includeint n,high,ans;
void dfs(int col,int fir,int sec)
int canput=((~(col|fir|sec))&high);
while(canput)
}int main()
return 0;
}
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棋盤裡使不存在兩個皇后在同行同列和同一斜線上...