目的: 檢驗學員對 bitwise operator 及遞迴程式設計的認知
1
西洋棋中的皇后可以直線前進,吃掉遇到的所有棋子,如果棋盤上有 8 個皇后,則這 8 個皇后如何相安無事地放置在棋盤上,1970 年與 1971 年, E.W.Dijkstra 與 N.Wirth 曾用這個問題來講解程式設計之技巧。
關於棋盤的問題,都可以用遞迴求解,然而如何減少遞迴的次數?在八個皇后的問題中,不必要所有的格子都檢查過,例如若某列檢查過,該該列的其它格子就 不用再檢查了,這個方法稱為分支修剪。
所以檢查時,先判斷是否在已放置皇后的可行進方向上,如果沒有再行放置下一個皇后,如此就可大大減少遞迴的次數,例如以下為修剪過後的遞迴檢 查行進路徑:
8 個皇后的話,會有 92 個解答,如果考慮棋盤的旋轉,則旋轉後扣去對稱的,會有 12 組基本解。 [ source ]
透過 bitwise 演算法 改寫為以下 C 程式:
其中 solve_queens
的參數 n
,數值介於 4
到 16
。
請補完程式碼。
作答區
A1 = ?
(a)
16(b)
15(c)
14(d)
13(e)
12(f)
11(g)
10(h)
9(i)
8A2 = ?
(a)
7(b)
6(c)
5(d)
4(e)
3(f)
2(g)
1(h)
0A3 = ?
(a)
7(b)
6(c)
5(d)
4(e)
3(f)
2(g)
1(h)
0A4 = ?
(a)
7(b)
6(c)
5(d)
4(e)
3(f)
2(g)
1(h)
0延伸題目:
n
的有效範圍比 [4, 16]
更大,但仍透過 bitwise 操作,並改寫為 iteration 程式;2
考慮到以下程式碼:
這是 data alignment 的巨集,data alignment 的意思是,data 的 address 扣除 base address 後 (也就是 offset) 可被 1, 2, 4, 8 等等這些數字整除,從這些數字可以發現他們都是 2N (N 為從 0 開始的整數)。換句話說,這些 data object 可以用 1, 2, 4, 8 byte 去 alignment
所以如果你的資料是分布在 bit 1 ~ bit 4 那還是會
考慮 4-byte boundary,當 x 是 0x1006
, a 是 4
, 那麼 ALIGN(x, a)
會得到什麼數值?
作答區
X = ?
(a)
0x1000(b)
0x1004(c)
0x1008(d)
0x100b(e)
0x1010