解数独

解数独

题目

编写一个程序,通过填充空格来解决数独问题。
数独的解法需遵循如下规则:
1.数字1-9在每一行只能出现一次。
2.数字1-9在每一列只能出现一次。
3.数字1-9在每个粗实线分割的3*3宫内只能出现一次。
数独部分空格内已经填入数字,空白格用'.'表示。

示例

image
image

解题思路

  1. 每一行数字分别1-9。
  2. 每一列数字分别1-9。
  3. 每3*3小方格数字填充也是1-9。
  4. 对每个空格依次填入数字1-9.
  5. 对于每次填充数字需要判断该数字是否满足条件。
  6. 若是不满住,则重新填充其他数字。
  7. 若是全不满足,则表示前面数字填充失误,进行回溯。
  8. 直到满足上述条件。

解题过程

  1. 编写函数,判断填充数字是否满足条件。
  2. 编写回溯函数
  3. 对算法进行验证,修改代码逻辑。

代码

class Solution {
public:
    bool isgoodNumber(const vector<vector<char>>& borad, int row, int col, char number){
        if(row >= 9 || col >= 9) return false;
        for(int i = 0; i < 9; i++){
            if(borad[row][i] == number || borad[i][col] == number) return false;
        }
        //判读对应的方格是否瞒住条件
        int num1 = col / 3; // 8  2
        int num2 = row / 3; // 0  0
        for(int i = 0; i < 3; i++){
            for(int k = 0; k < 3; k++){
                if(borad[num2*3+i][num1*3+k] == number) return false;
            }
        }
        return true;
    }
    bool findShudoku(vector<vector<char>>& board){
        
        for(int i = 0;  i < 9; i++){
            for(int k = 0; k < 9; k++){
                if(board[i][k] != '.') continue;
                for(char c = '1';  c <= '9'; c++){
                    if(isgoodNumber(board, i, k, c)){
                        board[i][k] = c;
                        if(findShudoku(board)) return true ;
                        board[i][k] = '.';
                    }
                }
                return false;
            }
        }
        return true;
    }
    void solveSudoku(vector<vector<char>>& board) {
        findShudoku(board);
    }
};
posted @ 2026-01-17 10:12  heyuikn  阅读(1)  评论(0)    收藏  举报