Dancing Links一般都用來解決精確覆蓋問題,什麼是精確覆蓋問題呢?就是下面這種:
DancingLinks精確覆蓋
題目描述
對於如下01矩陣,選擇若干行,使得矩陣的每一列都有且僅有一個1
1,4,5行,是精確覆蓋的一個解,如何用Dancing Link得到這個解的,可以參考代碼
http://blog.csdn.net/acmer1183/article/details/6320437
接下來重點講解,對於這個題目,dance links的具體的舞蹈步驟和過程,也就是對如上參考程式的詳解
首先,選擇2行1列後(即綠框所在的行),帶來效應是:1,4,7列都被刪除了,2,4,5,6行也被刪除了
| x |
|
|
x |
|
|
x |
|
| 0 |
0 |
1 |
0 |
1 |
1 |
0 |
|
| 1 |
0 |
0 |
1 |
0 |
0 |
1 |
x |
| 0 |
1 |
1 |
0 |
0 |
1 |
0 |
|
| 1 |
0 |
0 |
1 |
0 |
0 |
0 |
x |
| 0 |
1 |
0 |
0 |
0 |
0 |
1 |
x |
| 0 |
0 |
0 |
1 |
1 |
0 |
1 |
x |
圖中被染色的行列,表示這些行列已經被刪除了,綠框所在的行表示,當前選擇的是第幾行
尚有2,3,5,6列有待刪除,dancinglink還需繼續dancing
我們選擇包含1最少的列來刪除,現在包含1最少的列是第2列
| x |
x |
x |
x |
|
x |
x |
|
| 0 |
0 |
1 |
0 |
1 |
1 |
0 |
x |
| 1 |
0 |
0 |
1 |
0 |
0 |
1 |
x |
| 0 |
1 |
1 |
0 |
0 |
1 |
0 |
x |
| 1 |
0 |
0 |
1 |
0 |
0 |
0 |
x |
| 0 |
1 |
0 |
0 |
0 |
0 |
1 |
x |
| 0 |
0 |
0 |
1 |
1 |
0 |
1 |
x |
此時,只有第5列還沒有刪除,由於第5列沒有1,(本來第5列有兩個1,但分別在第一步和第二步被刪掉了,分別被染成藍色和綠色)所以要進行回溯
在進行回溯時,由於第3行2列的儲存格沒有兄弟節點;也就是說這個儲存格所在的列,當時有 且僅有一個1
這裡著重解釋一下“當時”:本來,3行2列的儲存格(綠色儲存格)是有一個兄弟節點(5行2列的儲存格)的,
但這個兄弟節點在dancing的前一步就已經被剔除掉了並且被染成藍色,是因為我們之前選擇了1列2行的元素
兄弟關係:在同一列不同行的值為1的儲存格,並且這些儲存格的顏色相同,這樣這些儲存格才有兄弟關係
發現選擇2,3行無解,開始回溯,直接回溯成這樣:
繼續dancing,選擇含1最少的列
繼續dancing,選擇含1最少的列
現在,所有的列都被刪除了,所以選擇1,4,5行,是精確覆蓋的一個解