位運算 8皇后學習筆記

2021-07-07 09:32:35 字數 729 閱讀 4239

**與注釋

**與講解

結合**

void init(int row, int ld, int rd)  

}  else  

}  自己加的一點理解筆記:

8皇后是行、列與兩個對角線不能衝突。

而逐行進行放置就不需要考慮行的問題,

只需逐列考慮列及對角線是否衝突即可。

依次放第一行的列,第二行的列,

直到第n行的列。

圖1,先放第一行第一列,並用二進位制位標記,

同時標記第二行中不可放置的位置。注:斜線

的標記不必一次標完,每次放下一行時再標記即可。

圖2,準備在第二行的某列上放,由於1,2列衝突所以

放第3列,然後標記下一行哪些列被斜線佔據,標記

好後並移位(這裡包含上一行的當前行的斜線位標記,

移位後就是下一行不能被占用的位置,因為兩個斜線

是向兩側延伸),然後就標出了下一行哪些位置不能使用。

上述的過程遞迴進行,即

如果還有某個位置沒放,在第一行的某列放

讓後放置第2行某列

放置第n行的某列

如果某個位置不可放置,回溯到前一步,如果全部放置完畢則記錄乙個答案。

最後表示斜線所需要的二進位制位和列一樣為n位,即表示當前行的某些列是否被斜線占用即可。

8皇后位操作解法

include using namespace std long sum 0 用來記錄皇后放置成功的不同布局數 long upperlim 1 8 1 這是八皇后的位置 試探演算法從最右邊的列開始 void test long row,long ld,long rd row,ld,rd進行或運算,求...

n皇后 位運算版

n皇后問題是大家在遞迴裡會碰到的乙個經典問題。以前高中我學dfs的時候,老師首先讓我看的就是八皇后。不過這皇后的時間複雜度大家可想而知了。而接下來的位運算將這個效率重新提到乙個高度。我是以前在matrix67大牛那裡學的,最近資料結構實驗剛好碰到n皇后,就在這裡 複述 一遍吧。code void d...

位運算學習筆記

1.補碼 補碼是為了表示乙個負數的二進位制形式。其轉化方式是,先將負數當成正數,轉化成二進位制的形式,再將二進位制正數的各個位上取反,再加上 例如 5先求出5的二進位制數 0000 0000 0101 然後將各個位上0變1 1變0 1111 1111 1010 最後再加1 1111 1111 101...