首先看看數獨問題(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...