1. 程式人生 > 實用技巧 >【】$9\times 9$數獨

【】$9\times 9$數獨

傳送門

題意

輸入一個字串,包含81個字元,代表81個方格內的資料,每個字元都是一個數字或者一個'.',表示該格子沒有填充,
假設每一個數獨都只有一個解決方案,end表示檔案的結尾

資料範圍

題解

下標從\(0\)開始的字串將它對映成在矩陣中的下標是 \((\frac{i}{9},i\; mod\; 9)\)
將矩陣中的下標對映成字串中的下標是 \(i\times 9+j\)
一共有\(3\times 3=9\)個大小為\(3\times 3\)的方格,下標從\(0\)開始,所以\(\frac{x}{3}\)下取整,\(\frac{y}{3}\)下取整可以算出來是位於哪一個方格上面的
每一行每一列,每一個\(3\times3\)

格子中都用一個\(2\)進位制數字表示\(1\sim 9\)哪些數字可以被填
通過\(\&\)運算求交集即為這個位置上可以填的數字
預處理出\(p\)陣列和\(num\)陣列,
\(p\)陣列代表\(9\)位二進位制數每一位上的\(1\)對應的數字,
\(num\)陣列代表\(1\)\(29-1\)上的每一個數字中\(1\)的個數
剪枝優化:

  1. 優化搜尋順序

從當前能填的合法數字個數最少的位置開始填,這樣可以有效的減少搜尋樹的規模,提高時間複雜度,例如只有一個那這個就可以直接填上,回溯的過程次數會變少
2. 排除等效冗餘

在任何一個狀態下都只需要找一個位置填數就可以,因為其他位置可以在更深的搜尋層中被搜尋到
3. 利用lowbit來求第一個1

Code