LeetCode 37题:解数独

这篇具有很好参考价值的文章主要介绍了LeetCode 37题:解数独。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

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

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

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

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

示例 1:

LeetCode 37题:解数独,LeetCode练习题,leetcode,算法,职场和发展

输入: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"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:


LeetCode 37题:解数独,LeetCode练习题,leetcode,算法,职场和发展

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 '.'
  • 题目数据 保证 输入数独仅有一个解

代码

可以参考前身:有效的数独文章来源地址https://www.toymoban.com/news/detail-648827.html

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

void solveSudoku(char **board, int boardSize, int *boardColSize);
bool isValidSudoku(char **board, int boardSize, int *boardColSize);

int main()
{
    // char b[9][10] = 
    //     {"53..7....",
    //      "6..195...",
    //      ".98....6.",
    //      "8...6...3",
    //      "4..8.3..1",
    //      "7...2...6",
    //      ".6....28.",
    //      "...419..5",
    //      "....8..79"};
    char b[9][10]=
        {"..9748...",
        "7........",
        ".2.1.9...",
        "..7...24.",
        ".64.1.59.",
        ".98...3..",
        "...8.3.2.",
        "........6",
        "...2759.."};
    int t, *te;
    char **board = (char **)malloc(sizeof(char *) * 9);
    for (int i = 0; i < 9; i++)
    {
        board[i] = b[i];
        printf("%s ", b[i]);
    }
    printf("\n");
    solveSudoku(board, t, te);
    for (int i = 0; i < 9; i++)
    {
        printf("%s ", board[i]);
    }
    return 0;
}

void solveSudoku(char **board, int boardSize, int *boardColSize)
{
    int r, c;
    for (int p = 0; p < 9; p++)
    {
        for (int q = 0; q < 9; q++)
        {
            if (board[p][q] == '.')
            {
                r = p;
                c = q;
                continue;
            }
        }
    }
    static int sign = 0;
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            if (board[i][j] == '.')
            {
                int p;
                for (p = 1; p <= 9 && sign == 0; p++)
                {
                    board[i][j] = p + '0';
                    if (isValidSudoku(board, boardSize, boardColSize) == 1)
                    {
                        if (i == r && j == c)
                        {
                            sign = 1;
                        }
                        solveSudoku(board, boardSize, boardColSize);
                        if (sign == 1)
                        {
                            return;
                        }
                    }
                    else
                    {
                        sign = 0;
                        continue;
                    }
                }
                if (p == 10)
                {
                    board[i][j] = '.';
                }
                return;
            }
        }
    }
    for (int i = 0; i < 9; i++)
    {
        printf("%s ", board[i]);
    }
    printf("\n");
}

bool isValidSudoku(char **board, int boardSize, int *boardColSize)
{
    int rownums[10], colnums[10];
    memset(rownums, 0, sizeof(rownums));
    memset(colnums, 0, sizeof(colnums));
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            if (board[i][j] != '.')
            {
                int number = board[i][j] - '0';
                if (rownums[number] == 0)
                {
                    rownums[number] = 1;
                }
                else
                    return false;
            }
            if (board[j][i] != '.')
            {
                int number = board[j][i] - '0';
                if (colnums[number] == 0)
                {
                    colnums[number] = 1;
                }
                else
                    return false;
            }
        }
        memset(rownums, 0, sizeof(rownums));
        memset(colnums, 0, sizeof(colnums));
    }
    int i = 0, j = 0;
    for (int p = 3; p <= 9; p = p + 3)
    {
        for (int q = 3; q <= 9; q = q + 3)
        {
            i = p - 3;
            for (; i < p; i++)
            {
                j = q - 3;
                for (; j < q; j++)
                {
                    if (board[i][j] != '.')
                    {
                        int number = board[i][j] - '0';
                        if (rownums[number] == 0)
                        {
                            rownums[number] = 1;
                        }
                        else
                            return false;
                    }
                }
            }
            memset(rownums, 0, sizeof(rownums));
        }
    }
    return true;
}

到了这里,关于LeetCode 37题:解数独的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】顺序表详解(附leetcode练习题)

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:数据结构 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺

    2023年04月27日
    浏览(39)
  • 37. 解数独 - 力扣(LeetCode)

    题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 输入

    2024年01月24日
    浏览(28)
  • LeetCode 37题:解数独

    编写一个程序,通过填充空格来解决数独问题。 数独的解法需  遵循如下规则 : 数字  1-9  在每一行只能出现一次。 数字  1-9  在每一列只能出现一次。 数字  1-9  在每一个以粗实线分隔的  3x3  宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白

    2024年02月13日
    浏览(22)
  • leetcode 37. 解数独

               这题也是回溯经典应用题,和之前n皇后问题的最大区别是, 之前n皇后问题每行只需要放一个皇后,本质上属于一维的,即回溯的for循环只有一层。此时是一个二维的回溯递归,for循环有两层。         本题回溯函数的返回值为bool类型,原因是本题我们只需要返

    2024年02月15日
    浏览(18)
  • LeetCode(力扣)37. 解数独Python

    https://leetcode.cn/problems/sudoku-solver/description/

    2024年02月09日
    浏览(22)
  • 模拟实现atoi函数(将数字字符串转换为整型)附加leetcode练习题

    各位朋友们,大家好啊!今天我为大家分享的知识是如何模拟实现atoi函数。相信大家如果能够理解这个知识,对大家以后的刷题是有帮助的。 我们要想实现某个函数,我们肯定要先知道这个函数的作用是什么,然后我们再根据它的作用来自己实现。我们先来看看stoi函数在库

    2023年04月19日
    浏览(45)
  • 练习题----顺序栈算法

    ​输入一个包括 \\\'(\\\' 和 \\\')\\\' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件: A. 左括号必须用相同类型的右括号闭合。 B. 左括号必须以正确的顺序闭合。 C. 每个右括号都有一个对应的相同类型的左括号。 ​该题需

    2024年04月26日
    浏览(33)
  • <算法学习>动态规划练习题

    本篇文章为初学动态规划时的练习题。参考优质博客学习后根据伪代码描述完成代码。记录一下用于以后复习。 给定一个有n行数字组成的数字三角形. 试设计一个算法, 计算出从三角形的顶至底的一条路径, 使该路径经过的数字和最大. 算法设计: 对于给定的n行数字组成的三角

    2024年01月17日
    浏览(36)
  • Matlab:遗传算法,模拟退火算法练习题

    1、遗传算法 (1) 遗传算法 是一种基于自然选择原理和自然遗传机 制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目 标的优化。遗传算法的实质是通过群体搜索技术,根据适者生存的原则逐代进化,最终 得到最优解或准最优解。它必须

    2024年01月21日
    浏览(32)
  • 【算法设计与分析】动态规划-练习题

    输入一个整数数组 S[n] ,计算其最长递增子序列的长度,及其最长递增子序列。 定义 k ( 1 ≤ k ≤ n ) k (1 ≤ k ≤ n) k ( 1 ≤ k ≤ n ) ,L[k]表示以 S[k] 结尾的递增子序列的最大长度。子问题即为 L[k]。 对于每一个k,我们都遍历前面0~k-1的所有的数,找出最大的L[i],且 S [ k ] L [

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包