leetcode Sudoku Solver

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);
    }
};
發佈了138 篇原創文章 · 獲贊 5 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章