程式設計實現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盤面陣列 知識點查詢,搜尋,排...