leetcode 37. Sudoku Solver 深搜/dancing links

Write a program to solve a Sudoku puzzle by filling the empty cells.

A sudoku solution must satisfy all of the following rules:

Each of the digits 1-9 must occur exactly once in each row.
Each of the digits 1-9 must occur exactly once in each column.
Each of the the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid.
Empty cells are indicated by the character ‘.’.

A sudoku puzzle…

…and its solution numbers marked in red.

Note:

The given board contain only digits 1-9 and the character ‘.’.
You may assume that the given Sudoku puzzle will have a single unique solution.
The given board size is always 9x9.

DFS 搞一下,当然也可以用 dancing links

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
        solve(board);
    }
    bool solve(vector<vector<char>>& board){
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++){
                if(board[i][j]!='.')continue;
                for(int k=1;k<=9;k++){
                    if(!check(board,i,j,k))continue;
                    board[i][j]=k+'0';
                    if(solve(board))return true;
                    board[i][j]='.';
                }
                return false;
            }
        return true;
    }
    bool check(vector<vector<char>>& board, int r, int c, int d){
        for(int i=0;i<9;i++){
            if(board[r][i]==d+'0')return false;
            if(board[i][c]==d+'0')return false;
            if(board[r/3*3+i/3][c/3*3+i%3]==d+'0')return false;
        }
        return true;
    }
};
posted @ 2020-07-25 12:17  winechord  阅读(56)  评论(0编辑  收藏  举报