LeetCode 37题:解数独

news2024/10/7 9:23:04

题目

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

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

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

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

示例 1:

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


提示:

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

代码

#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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker中MySQL应用部署操作步骤

在linux系统下安装mysql、安装redis是非常麻烦的&#xff0c;但是docker出现后&#xff0c;应用安装会非常简洁。 1.MySQL部署 2.docker中部署mysql的步骤 创建mysql容器 这样mysql就部署好了。 外部机器连接docker中部署的mysql

Python学习笔记_基础篇_初识python

Python简介 python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;吉多范罗苏姆为了在阿姆斯特丹打发时间&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承。 Python和其他语言的对比&#xff…

15个免费的图标素材网站推荐

想象力没有限制。你在寻找下载免费矢量图标网站吗&#xff1f;本文为需要使用各种图标美化网页布局和界面设计&#xff0c;简单提升更好用户体验的设计师提供了15个矢量图标网站。 1.即时设计资源社区 即时设计是国内一款专业级的 UI 设计工具&#xff0c;像 PC 端的网页&…

htmlCSS-----弹性布局

目录 前言 什么是弹性布局 样式 学习概要 容器和项目 弹性布局的排列方式 1.横向排列&#xff08;默认样式&#xff09; 2.父元素容器的属性&#xff08;*5&#xff09; &#xff08;1&#xff09;主轴 代码示例&#xff1a; &#xff08;2&#xff09;交叉轴 3.子元素…

资料分析(三)—— 基期、现期、人口、增长量

基期 基期值 现期值 - 增长量 增长量/增长率 现期值/1&#xff08;间隔)增长率 化除为乘 &#xff1a;当增长率&#xff5c;r| < 5% 时&#xff0c;&#xff0c; 注&#xff1a;当选项首位相同&#xff0c;第二位也相同时&#xff0c;只能用直除 基期和差 (结合选…

Android9开机启动与FBE过程完整介绍与LOG流程

一&#xff0c;开机整体流程概述 Init进程作为Android的第一个user space(用户空间)的进程&#xff0c;它是所有 Android 系统 native service 的祖先&#xff0c;它的进程号是 1。 init进程工作分为第一阶段和第二阶段。 二&#xff0c;init fisrt stage 代码参考&#xff…

js操作剪贴板讲解

文章目录 复制&#xff08;剪切&#xff09;到剪贴板Document.execCommand()Clipboard复制Clipboard.writeText()Clipboard.write() copy&#xff0c;cut事件 从剪贴板进行粘贴document.execCommand(paste)Clipboard粘贴Clipboard.readText()Clipboard.read() paste 事件 安全性…

使用docker快速搭建wordpress服务,并指定域名访问

文章目录 引入使用docker快速跑起服务创建数据库安装wordpress服务配置域名 引入 wordpress是一个基于PHP语言编写的开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;它有丰富的插件和主题&#xff0c;可以非常简单的创建各种类型的网站&#xff0c;包括企业网站、…

云安全攻防(十一)之 容器编排平台面临的风险

前言 容器技术和编排管理是云原生生态的两大核心部分——前者负责执行&#xff0c;后者负责控制和管理&#xff0c;共同构成云原生技术有机体&#xff0c;我们以 Kubernetes 为例&#xff0c;对容器编排平台可能面临的风险进行分析 容器编排平台面临的风险 作为最为流行的云…

LeetCode150道面试经典题-- 快乐数(简单)

1.题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&am…

OpenLayers实战,高德GCJ-02坐标系转WGS-84坐标系

专栏目录: OpenLayers实战进阶专栏目录 前言 本章实现高德GCJ-02坐标系转WGS-84坐标系。日常开发中经常遇到源坐标高德的情况,这时候如果地图不是高德,而是使用的wgs84坐标系的地图,或者其他坐标系的情况下,就会导致位置偏移,本章就是解决高德坐标偏移问题。 二、依赖…

Detecting Twenty-thousand Classes using Image-level Supervision

Detecting Twenty-thousand Classes using Image-level Supervision 摘要背景方法PreliminariesDetic:具有图像类别的检测器loss技术细节扩展Grad-CAMGrad-CAM原理 总结 摘要 摘要 由于检测数据集的规模较小&#xff0c;目前的物体检测器在词汇量方面受到限制。而图像分类器的数…

深入了解Linux运维的重要性与最佳实践

Linux作为开源操作系统的代表&#xff0c;在企业级环境中的应用越来越广泛。而在保障Linux系统的正常运行和管理方面&#xff0c;Linux运维显得尤为关键。本文将介绍Linux运维的重要性以及一些最佳实践&#xff0c;帮助读者更好地了解和掌握Linux系统的运维技巧。 首先&#xf…

【Linux初阶】system V消息队列 + system V信号量

文章目录 一、system V消息队列&#xff08;了解&#xff09;二、system V信号量&#xff08;了解&#xff09;1.信号量是什么2.临界资源和临界区3.互斥4.为什么要信号量 三、IPC资源的组织方式结语 一、system V消息队列&#xff08;了解&#xff09; 消息队列提供了一个从一…

玩转IndexedDB,比localStorage、cookie还要强大的网页端本地缓存

随着浏览器的功能不断增强&#xff0c;越来越多的网站开始考虑&#xff0c;将大量数据储存在客户端&#xff0c;这样可以减少从服务器获取数据&#xff0c;直接从本地获取数据。 现有的浏览器数据储存方案&#xff0c;都不适合储存大量数据&#xff1a;Cookie 的大小不超过 4K…

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测&#xff1b; 2.运行环…

找到链表的第一个入环节点

1.题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

会玩这 10 个 Linux 命令,一定是个有趣的 IT 男!

Linux当中有很多比较有趣的命令&#xff0c;可以动手看看&#xff0c;很简单的。 1.rev命令 一行接一行地颠倒所输入的字符串。 运行&#xff1a; $rev如输入&#xff1a;shiyanlou shiyanlou2.asciiview命令 1.先安装aview $sudo apt-get install aview2.再安装imagema…

zabbix案例--zabbix监控Tomcat

目录 一、 部署tomcat 二、配置zabbix-java-gateway 三、配置zabbix-server 四、配置zabbix-web界面 一、 部署tomcat tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/ ln -sv /usr/local/apache-tomcat-8.5.16/ /usr/local/tomcat cd /usr/local/tomcat/bin开启JMX…

如何解决docker中出现的“bash: vim: command not found”

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在docker中&#xff0c;想要执行vim编辑文件&#xff0c;弹出“docker bash: vim: command not found“&#xff08;如下图&#xff09;&#xff0c;请问该如何解决&#xff1f; 问题解决&#xff1a; …