題目描述
相信 n-Queen 問題對每個研究 backtracking 的人來講都不陌生,這個問題是要在一個 $n \times n$ 大小的棋盤上擺n個皇后,讓她們不會互相攻擊到。為了讓這個問題更難一點,我們設計了一些障礙物在棋盤上,在這些點上不能放皇后。請留意這些障礙物並不會防止皇后被攻擊。
在傳統的 8-Queen 問題中,旋轉與鏡射被視為不同解法,因此我們有 92 種可能的方式來放置皇后。
輸入格式
輸入的資料最多包含 10 筆測試個案,每個測試個案的第一行會有一個整數 $n$ ($3 < n < 20$),接下來的 $n$ 行代表棋盤資料,點號 '.'
代表空的盤格,星號 '*'
代表放有障礙物的盤格。
輸出格式
對每筆測試個案,輸出這是第幾個 case 以及這個 case 有幾種可能的放置方式。
範例輸入
|
|
範例輸出
|
|
Solution
首先,必須先認識最快的 N 皇后問題可以利用 bitmask 的技術,把過多的 memory access 的指令捨去而加速。
- 樸素平行 Accepted (2766 ms, 512 KB)
- 負載平衡 Accepted (1771 ms, 5248 KB)
樸素平行
在大多數的教科書上,平行只針對第一個列的位置平行,因此平行度最多 $N$,針對第一列每一個位置都分別開一個 thread 找解,這樣運算時間相當於跑最慢的那一個 thread。
|
|
負載平衡
為了達到每一個 thread 盡可能分到相同的工作量,避免最慘的那一條有太多的解而很慢,做好細粒度 (fine-grain) 的分配,如此一來工作量就很高的機率會相同。
因此,一開始先進行廣度搜索,把前幾列的解展開,也許會獲得 $N^x$ 種盤面,這時候平均切給 $M$ 條 thread,分配的工作量平衡上就有比較好的展現。
|
|