天天看點

uva519 - Puzzle (II)(回溯)

題目大意:給出拼圖,要求将給出的拼圖拼成 n行m列的矩形,可以輸出yes,不行輸出no。

解題思路:直接dfs,但是需要剪枝。

1、判斷 F 的出現個數是否等于 2 * ( n + m) , 還有IO的個數是否比對,不比對就直接剔除,。

2、邊界問題要處理,例如第一行第N行,第一列第M列,這些地方的拼圖是有要求的,這些邊界拼圖的的外圍都要是F。例如第一行的top要是F,不是F的直接不考慮。(這點導緻我TL了N次)

3、相同形狀的拼圖,在相同一層的dfs裡可以不用在考慮了。因為前面出現了一樣的但是結果是不行的,是以和他相同的就不需要考慮了,但是這個僅限于同一層dfs裡面,因為如果不是同一層,那麼可能前面與他相鄰的拼圖變化了,這樣這個形狀的拼圖可能在這種情況下就是可以的。相同形狀的可以用三進制數表示,也可以排序後,直接字元串比較。

4、可以将這些拼圖事先分好組,上面為F一組,下面為F的為1組,我這裡分了12組。這樣查找的時候就可以把範圍縮小了。

前三點做到了就可以過了。

代碼:(做到四點)

代碼:(做到三點)