Leetcode - 037. Sudoku Solver

原題地址數組

建議解鎖 Leetcode - 036. Valid Sudoku 以後再處理本題debug

個人思路:
1.須要遍歷整個解空間求得可行解,隸屬 dfs + backtracing
2.須要used數組記錄每行,每列,每塊的數字佔用狀況
2.1 初始數組指定一部分const 的佔用狀況
2.2 dfs的過程當中會更新used,backtraing 的過程會抹去上一次的嘗試
3.一個隱藏的trick是dfs + backtracing在總體退出以後會回到進入以前的狀態,因此退出以後
board會跟原始狀態一致,因此須要另一個board存儲解
新手注意:(當時由於這一點困擾了我一個夜晚,dfs + backtraing 又很差debug,蛋疼)code

class Solution {
public:

    void dfs(vector<vector<char>> &ans, vector<vector<char>> & board,
        vector<vector<int>> &row, vector<vector<int>> &col, vector<vector<int>> bok,
        int cur_i, int cur_j)
    {
        if (cur_j >= 9)
        {
            cur_j = 0;
            ++cur_i;
        }
        if (cur_i >= 9)
        {
            ans = board;
            return;
        }
        char ch = board[cur_i][cur_j];
        if (ch != '.')
        {
            dfs(ans, board, row, col, bok, cur_i, cur_j + 1);
        }
        // 試圖在board[cur_i][cur_j]的位置放上val
        for (int val = 1; val <= 9; ++val)
        {
            int cur_k = 3 * (cur_i / 3) + cur_j / 3;
            if (row[cur_i][val] == 0 && col[cur_j][val] == 0 && bok[cur_k][val] == 0)
            {
                row[cur_i][val] = 1;
                col[cur_j][val] = 1;
                bok[cur_k][val] = 1;
                board[cur_i][cur_j] = char(val + '0');
                dfs(ans, board, row, col, bok, cur_i, cur_j + 1);
                board[cur_i][cur_j] = ch;
                row[cur_i][val] = 0;
                col[cur_j][val] = 0;
                bok[cur_k][val] = 0;
            }
        }
    }

    void solveSudoku(vector<vector<char>>& board) {
        vector<vector<char>> ans;
        vector<vector<int>> row(9, vector<int>(10, 0));
        vector<vector<int>> col(9, vector<int>(10, 0));
        vector<vector<int>> bok(9, vector<int>(10, 0));
        for (int i = 0; i < 9; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                char ch = board[i][j];
                if (ch == '.')
                    continue;
                int num = ch - '0';
                int k = 3 * (i / 3) + j / 3;
                row[i][num] = 1;
                col[j][num] = 1;
                bok[k][num] = 1;
            }
        }
        dfs(ans, board, row, col, bok, 0, 0);
        board = ans;
    }
};
相關文章
相關標籤/搜索