POJ2676===sudoku===搜索

来源:互联网 发布:淘宝首页装修尺寸 编辑:程序博客网 时间:2024/05/22 11:42
#include<iostream>#include<cstdio>#include<vector>#include<algorithm>#include<cstring>using namespace std;short rowFlags[9][10];  //行标记 short colFlags[9][10];  //列标记 short blockFlags[9][10];  //块标记  每个小的九宫格作为一个小块 //上面三个数组的一维代表行列位置或标号位置   二维坐标代表1-9某个数字    int board[9][9];struct Pos{int r, c;Pos(int rr, int cc):r(rr), c(cc) {}}; vector<Pos> blankPos;inline int getBlockNum(int r, int c) {//根据坐标来确定是第几个九宫格 int rr = r/3;int cc = c/3;return rr*3 + cc;}void setAllFlags(int i, int j, int num, int f) {rowFlags[i][num] = colFlags[j][num] = blockFlags[getBlockNum(i, j)][num] = f;} bool isOk(int i, int j, int num) {return !rowFlags[i][num] && !colFlags[j][num] && !blockFlags[getBlockNum(i, j)][num];}bool dfs(int n) {//处理前n个空格if(n < 0) return true;int r = blankPos[n].r ;int c = blankPos[n].c ;for(int num = 1; num <= 9; ++ num) {if( isOk(r, c, num) ) {board[r][c] = num;setAllFlags(r, c, num, 1);if(dfs(n-1)) return true;setAllFlags(r, c, num, 0);}}return false;}int main() {int t;cin >> t;while(t--) {//初始化memset(rowFlags, 0, sizeof(rowFlags));memset(colFlags, 0, sizeof(colFlags));memset(blockFlags, 0, sizeof(blockFlags));blankPos.clear(); //输入for(int i = 0; i < 9; ++ i) {for(int j = 0; j < 9; ++ j) {scanf("%1d", &board[i][j]);if(board[i][j])setAllFlags(i, j, board[i][j], 1);else blankPos.push_back(Pos(i, j)); }} //搜索if(dfs(blankPos.size()-1))  {for(int i = 0; i < 9 ; ++ i) {for(int j = 0; j < 9; ++ j ) {cout << board[i][j];}cout << endl;}}}return 0;}

0 0
原创粉丝点击