N皇后問題 狀態壓縮

2022-04-13 18:06:19 字數 1433 閱讀 8238

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

利用行減列 得到以下數字  所以在同乙個主對角線上的 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棋盤裡使不存在兩個皇后在同行同列和同一斜線上...