簡單易懂的Dancing links講解(2)

來源:互聯網
上載者:User

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行,是精確覆蓋的一個解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.