Sudoku數獨(dfs 狀態壓縮)

2021-10-23 04:37:07 字數 1311 閱讀 7161

程式設計實現9x9數獨

將9x9的數獨以字串的形式輸入,81個字元,』.'表示需要補齊的數字。

以『end』作為結束符

同輸入的形式,81個數字字元。

狀態壓縮:因為數獨需要保證,每一行,每一列,每一宮的數字互不相同,那麼就可以以二進位制的形式表示這三種情況,比如:

舉某個數獨的一部分,第一行,第一列,第乙個宮:

7 1 ?4 ? 9 ? 5 8

3 ? 5

4 ? 89?

1?68

第一行表示為000100110:即若有這個數字則標記為0,沒有則標記為1,為了儲存方便,化為十進位制儲存,即38

第一列表示為000010010

第一宮表示為100100010

因此只需要對這三種情況,「與」運算即可得到,都為1的位置,得到這個十進位制數,然後通過lowbit得到依次得到,每乙個1代表的數字,因此只需要記錄所有的空值,然後通過位運算對所有空值dfs就可以得到最後答案。

因為資料保證有解,只需要輸出滿足數獨的一種解即可,所以最終滿足條件填滿即可return,因此,採取先填哪些可能性少的空值,能避免過多次數的回溯,需要加上這一優化才能過這道題。

#includeusing namespace std;

#define ll long long

#define n 12

#define maxm 100

#define inf 2147483640

#define ios ios::sync_with_stdio(false)

#define mod 10007

struct node;

int ff[n][n];

int r[n],c[n],g[n/3][n/3]; //狀態壓縮,1表示空值

vectorv; //記錄所有空值的座標

int mp[1<>1;

}return cnt;

}bool dfs(int cur)

); }

else

}dfs(0);

string ans="";

for(int i=0; i<9; i++)

for(int j=0; j<9; j++)

ans.push_back(ff[i][j]+48);

cout<

}return 0;

}

poj2676 Sudoku 數獨,dfs 剪枝)

給定乙個不完整9 9數獨,未填部分用0表示,恢復數獨,並列印 在讀入的時候,我們開幾個陣列,sudoku 9 9 相當於這張數獨地圖,上面記錄值 checkrow 9 10 第i行,是否出現過數v,1 v 9 checkcol 9 10 第j列,是否出現過數v,1 v 9 square 9 10 第...

數獨(Sudoku)求解程式

數獨完全求解程式 ver 3.0 coolypf 2008 11 24 22 11 include using namespace std int matrix 9 9 數獨矩陣 int count 0 解的個數 int check int x,int y,bool mark 10 檢測matrix...

華為OJ(數獨遊戲 Sudoku)

描述 問題描述 數獨 sudoku 是一款大眾喜愛的數字邏輯遊戲。玩家需要根據9x9盤面上的已知數字,推算出所有剩餘空格的數字,並且滿足每一行 每一列 每乙個粗線宮內的數字均含1 9,並且不重複。輸入 包含已知數字的9x9盤面陣列 空缺位以數字0表示 輸出 完整的9x9盤面陣列 知識點查詢,搜尋,排...