舞蹈鏈 精確覆蓋,解決數獨問題

2021-09-26 04:47:07 字數 1697 閱讀 8233

首先看看數獨問題(9*9的方格)的規則

1、每個格仔只能填乙個數字

2、每行每個數字只能填一遍

3、每列每個數字只能填一遍

4、每宮每個數字只能填一遍

那現在就是利用這個規則把數獨問題轉換為精確覆蓋問題

可是,直觀上面的規則,發現比較難以轉換為精確覆蓋問題。因此,把上面的表述換個說法

1、每個格仔只能填乙個數字

2、每行1-9的這9個數字都得填一遍(也就意味著每個數字只能填一遍)

3、每列1-9的這9個數字都得填一遍

4、每宮1-9的這9個數字都得填一遍

構建矩陣:

第1列定義成:(1,1)填了乙個數字

第2列定義成:(1,2)填了乙個數字

第9列定義成:(1,9)填了乙個數字

第10列定義成:(2,1)填了乙個數字

第18列定義成:(2,9)填了乙個數字

第81列定義成:(9,9)填了乙個數字

至此,用第1-81列完成了約束條件1:每個格仔只能填乙個數字

第82列定義成:在第1行填了數字1

第83列定義成:在第1行填了數字2

第90列定義成:在第1行填了數字9

第91列定義成:在第2行填了數字1

第99列定義成:在第2行填了數字9

第162列定義成:在第9行填了數字9

至此,用第82-162列(共81列)完成了約束條件2:每行1-9的這9個數字都得填一遍

第163列定義成:在第1列填了數字1

第164列定義成:在第1列填了數字2

第171列定義成:在第1列填了數字9

第172列定義成:在第2列填了數字1

第180列定義成:在第2列填了數字9

第243列定義成:在第9列填了數字9

至此,用第163-243列(共81列)完成了約束條件3:每列1-9的這9個數字都得填一遍

第244列定義成:在第1宮填了數字1

第245列定義成:在第1宮填了數字2

第252列定義成:在第1宮填了數字9

第253列定義成:在第2宮填了數字1

第261列定義成:在第2宮填了數字9

第324列定義成:在第9宮填了數字9

至此,用第244-324列(共81列)完成了約束條件4:每宮1-9的這9個數字都得填一遍

poj - 3074 :sudoku

const int maxnode = 2e5;

const int maxn = 1e3+11;

const int maxm = 1e3+11;

const int n = 9;

char mp[maxnode];

struct dlx

r[m] = 0;l[0] = m;

size = m;

for(int i = 1;i<=n;++i)

}void link(int r,int c) }

void remove(int c) }

void resume(int c)

l[r[c]] = r[l[c]] = c;

} bool dance(int d)

{ if(r[0] == 0)

{ ansd = d;

for(int i = 0;iz

舞蹈鏈應用之精確覆蓋模板

這幾天終於鼓起勇氣學了舞蹈鏈這種資料結構,在聯絡的過程中發現一般分為兩種情況 精確覆蓋和重複覆蓋 首先將一下精確覆蓋,顧名思義就是覆蓋全部的元素且只能覆蓋一次 在 實現的方面講即給出的0 1矩陣中找到對應的行號使這些行組成組成的新矩陣每列只有乙個1 模板 include include includ...

用舞蹈鏈實現數獨2

輸入12 12 12顯示答案,如果沒有顯示就是沒有結果 輸入13 13 13更換數獨開局 輸入0 8 0 8 0 9在指定位置放值 輸入11 11 11檢驗數獨是否正確 include include include rand函式 include srand函式 include consolecol...

C 解決數獨問題(回溯)

參考鏈結來自於 輸入乙個數獨作為9 9的陣列,例如輸入乙個測試資料map 9 9 為 0 9 0 0 0 0 0 6 0 8 0 1 0 0 0 5 0 9 0 5 0 3 0 4 0 7 0 0 0 8 0 7 0 9 0 0 0 0 0 9 0 8 0 0 0 0 0 6 0 2 0 7 0 0...