Leetcode 37. 解数独 C++

Leetcode 37. 解数独

题目

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

1.数字 1-9 在每一行只能出现一次。
2.数字 1-9 在每一列只能出现一次。
3.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

空白格用 ‘.’ 表示。
在这里插入图片描述
一个数独。
在这里插入图片描述
答案被标成红色

测试样例说明

  • 给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
  • 你可以假设给定的数独只有唯一解。
  • 给定数独永远是 9x9 形式的。

题解

回溯法寻找可行解。用3个数组,分别记录每行、每列、每单元格中1~9数字的使用情况,对于如何使用数组见上一题或见代码。在选取数组时,要保证每行、每列、每单元格中数字不能重复,如果没有可选的数则回溯

代码

int row[9][9]={0},column[9][9]={0},grid[9][9]={0};
    void generate(int i,int j,vector<vector<char>>& board,bool &selved){
        if(i>8){
            selved = true;		//用于确定已找到可行解,也就不用回溯了
            return;
        }
        if(board[i][j] == '.'){
            int n = 3*(i/3)+j/3;
            for(int k=0; k<9; k++){
                if(!row[i][k] && !column[j][k] && !grid[n][k]){		//保证该行、列、单元格没有使用该数
                    row[i][k]++;
                    column[j][k]++;
                    grid[n][k]++;
                    board[i][j]=k+'0'+1;
                    if(j == 8)  generate(i+1,0,board,selved);
                    else generate(i,j+1,board,selved);
                    if(!selved){
                        row[i][k]--;
                        column[j][k]--;
                        grid[n][k]--;
                        board[i][j]='.';
                    }

                }
            }
        }else{
            if(j == 8)  generate(i+1,0,board,selved);
            else generate(i,j+1,board,selved);
        }
    }
    

    void solveSudoku(vector<vector<char>>& board) {
        int i,j;
        for(i=0; i<9; i++){
            for(j=0; j<9; j++){
                if(board[i][j] == '.')  continue;
                int num = board[i][j]-'0'-1;
                row[i][num]++;
                column[j][num]++;
                grid[3*(i/3)+j/3][num]++;
            }
        }
        bool selved=false;
        generate(0,0,board,selved);
    }

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(Leetcode 37. 解数独 C++)