LeetCode 37 解数独 循环+回溯算法

简介: LeetCode 37 解数独 循环+回溯算法

37. 解数独

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


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


数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。


示例 1:

43c666db39c4d511879c8ff4798aa3dd.png

输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]

输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]

解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

c51cec79063dbfed0f343c17689cfc01.png

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) { 
        solve(board);                          }
private :
    bool solve1(vector<vector<char>>&board, int m,int n,char k)//判断加入的数字是否合法
    {
        for(int i=0;i<9;i++)
        {
            if(board[m][i]==k)  //列判断
            return false;
            if(board[i][n]==k)  //行判断
            return false;
            //九宫格判断
            if(board[i/3+m/3*3][i%3+n/3*3]==k)
            return false;
        }
        return true;
    }
private:    //遍历图表 用1到9的数字分别填入观察哪个合适
    bool solve(vector<vector <char >> &board)
    {
        for(int i=0;i<9;i++)
        {
        for(int j=0;j<9;j++)
        {
            if(board[i][j]=='.')
            {                                     //当board[i][j]=='.'时 进行判断
                for(char k='1';k<='9';k++)        //用char类型是因为有数字,'.'判断
                {
                if(solve1(board,i,j,k))           //如果当前数字符合条件
                {
                    board[i][j]=k;                //进行赋值
                    if(solve(board))              //循环里面有回溯
                    {
                        return true;
                    }
                    board[i][j]='.';               //如果上未找出正确答案 在这个点初始化为'.'
                }
                }
                return false;                    //循环结束未找到返回false
            }
           }
        }
    return true;
    }
};
目录
相关文章
|
2月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
49 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
8天前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
2月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
39 6
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
55 2
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
40 1
|
2月前
|
存储 算法 索引
LeetCode第36题有效的数独
这篇文章介绍了LeetCode第36题"有效的数独"的解题方法,通过使用三个二维数组分别记录每一行、每一列以及每个3x3宫格内1-9数字出现的次数,来验证给定数独是否有效。
|
2月前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
2月前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
下一篇
无影云桌面