LeetCode: 37. Sudoku Solver

LeetCode: 37. Sudoku Solver

题目描述

Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character ‘.’.
You may assume that there will be only one unique solution.

A sudoku puzzle…

…and its solution numbers marked in red.

大意就是说: 已知某个有且仅有唯一解的数独, 让我们写个代码解开它。

解题思路

用 DFS 就可以做出了。这里我们利用 LeetCode: 36. Valid Sudoku 的思路, 对数独进行标记。

AC源码

class Solution {
public:
    bool solveSudoku(vector<vector<char>>& board, int i, int j, int flag[][9])
    {
         if(i==9) return true;
         if(j==9) return solveSudoku(board, i+1, 0, flag);

        if(board[i][j] != '.')
        {
            return solveSudoku(board, i, j+1, flag);
        }
        else
        {
            for(int digit = 0; digit < 9; ++digit)
            {
                int f = flag[0][i] | flag[1][j] | flag[2][i/3*3+j/3];
                if(f & (1 << digit))
                {
                    continue;
                }
                else
                {
                    // 标记
                    flag[0][i] |= (1 << digit);
                    flag[1][j] |= (1 << digit);
                    flag[2][i/3*3+j/3] |= (1 << digit);
                    board[i][j] = digit + '1';

                    if(solveSudoku(board, i, j+1, flag)) return true;

                    // 取消标记
                    board[i][j] = '.';
                    flag[0][i] &= ~(1 << digit);
                    flag[1][j] &= ~(1 << digit);
                    flag[2][i/3*3+j/3] &= ~(1 << digit);
                }
            }
        }
        return false;
    }
    void solveSudoku(vector<vector<char>>& board) {
        int flag[3][9] = {0}; // 0: row, 1: column, 2: rect

        // 初始化标记
        for(int i = 0; i < board.size(); ++i)
        {
            for(int j = 0; j < board[i].size(); ++j){
                if(board[i][j] != '.')
                {
                    int value = 1 << (board[i][j] - '0' - 1);
                    if(flag[0][i] & value) return ;
                    else flag[0][i] |= value;

                    if(flag[1][j] & value) return ;
                    else flag[1][j] |= value;

                    int rectIdx = i/3*3 + j/3;
                    if(flag[2][rectIdx]&value) return ;
                    else flag[2][rectIdx] |= value;
                }
            }
        }
        solveSudoku(board, 0, 0, flag);
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务