leetcode Sudoku Solver

来源:互联网 发布:apache tools 编辑:程序博客网 时间:2024/06/07 05:59
class Solution {public:    int flip(int i){        int ret = 1 << i;        ret = ~ret;        return ret;    }    bool valid(int v, int x, int y, vector<int>&row, vector<int>&column, vector<int>&square){        int rowmark = row[x] & (1 << v);        int columnmark = column[y] & (1 << v);        int id1 = x / 3, id2 = y / 3;        int sid = id1 * 3 + id2;        int squaremark = square[sid] & (1 << v);        return rowmark == 0 && columnmark == 0 && squaremark == 0;    }    bool dfs(int x, int y, vector<int>&row, vector<int>&column, vector<int>&square, vector<vector<char> >&board){        bool tmp = false;        if(board[x][y] != '.'){            if(y == 8){                if(x == 8){                    return true;                }                else{                    tmp = dfs(x + 1, 0, row, column, square, board);                }            }            else{                tmp = dfs(x, y + 1, row, column, square, board);            }            return tmp;        }        for(int i = 1; i <= 9; ++i){            if(valid(i, x, y, row, column, square)){                row[x] |= (1 << i);                column[y] |= (1 << i);                int id1 = x / 3, id2 = y / 3;                int sid = id1 * 3 + id2;                square[sid] |= (1 << i);                board[x][y] = i + '0';                if(y == 8){                    if(x == 8){                        return true;                    }                    else{                        tmp = dfs(x + 1, 0, row, column, square, board);                    }                }                else{                    tmp =  dfs(x, y + 1, row, column, square, board);                }                if(!tmp){                    row[x] &= flip(i);                    column[y] &= flip(i);                    square[sid] &= flip(i);                    board[x][y] = '.';                }                if(tmp){                    return true;                }            }                    }        return false;    }    void solveSudoku(vector<vector<char> > &board) {        vector<int> row, column, square;        row.resize(9, 0);        column.resize(9, 0);        square.resize(9, 0);        for(int i = 0; i < 9; ++i){            for(int j = 0; j < 9; ++j){                int id1 = i / 3, id2 = j / 3;                int sid = id1 * 3 + id2;                switch(board[i][j]){                    case('.'):                        break;                    default:                        int v = board[i][j] - '0';                        row[i] |= (1 << v);                        column[j] |= (1 << v);                        square[sid] |= (1 << v);                        break;                }            }        }        dfs(0, 0, row, column, square, board);    }};
0 0
原创粉丝点击