2021.5.9-数独(回溯)

题目链接:https://leetcode-cn.com/problems/sudoku-solver
题目描述:
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。

题解:
题解详解


class Solution {
public:
    bool isValid(int row, int col,char val, vector<vector<char>>& board)
    {
        //校验每行是否重复
        for(int i = 0; i < 9; i++)
        {
            if(board[i][col] == val)
                return false;
        }
        //校验每列是否重复
        for(int j = 0; j < 9; j++)
        {
            if(board[row][j] == val)
                return false;
        }
        //校验3*3宫内是否重复
        int minRow = (row / 3) * 3;
        int minCol = (col / 3) * 3;
        for(int i = minRow; i < minRow + 3; i++)
        {
            for(int j = minCol; j < minCol + 3; j++)
            {
                if(board[i][j] == val)
                    return false;
            }
        }
        return true;
 
    }

    bool trackingBack(int row, int col, vector<vector<char>>& board)
    {
        //迭代到最后一行即结束
        if(row == board.size())
            return true;
        //迭代到最后一列即进入下一行第一列继续
        if(col == board[0].size())
            return trackingBack(row + 1, 0, board);
        //迭代的位置已经有数值,继续向后查找
        if(board[row][col] != '.')
            return trackingBack(row, col +1 , board);
        //找到可放数值位置后,从1-9中选择一个合法值放入
        for(char k = '1'; k <= '9'; k++)
        {
            if(isValid(row, col, k, board))
            {
               board[row][col] = k;
               if(trackingBack(row, col + 1, board))
                  return true;
               board[row][col] = '.';                 
            }
        }
        return false;
    }


    void solveSudoku(vector<vector<char>>& board) {
        trackingBack(0 , 0, board);
    }
};

原文地址:https://www.cnblogs.com/ZigHello/p/14750764.html