力扣 37. 解数独

news2024/7/4 5:22:44

一、题目描述

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

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

  • 数字 1-9 在每一行只能出现一次。
  • 数字 1-9 在每一列只能出现一次。
  • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
  • 数独部分空格内已填入了数字,空白格用 '.' 表示。

在这里插入图片描述

示例一:
输入: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"]
]

二、题解

通过回溯法求解,整体思路与N皇后问题相似,都是依次处理每个格子,同时通过一个 isValid 函数判断当前位置填充值的有效性。

同时因为题目中已经说明题目数据保证输入数独有且仅有一个解,因此我们需要让回溯函数返回值为布尔类型,这样只要遇到任意一种成功的情况,就立即依次返回。

class Solution {
public:
    void solveSudoku(vector<vector<char>> &board) {
        backtracking(board, 0, 0);
    }

private:
    bool backtracking(vector<vector<char>> &board, int row, int col) {
        if (row == board.size()) {
            return true;
        }

        if (board.at(row).at(col) == '.') {
            for (int i = 1; i <= 9; i++) {
                board.at(row).at(col) = static_cast<char>(i + 48);
                if (isValid(board, row, col)) {
                    if (col == board.size() - 1) {
                        if (backtracking(board, row + 1, 0)) {
                            return true;
                        }
                    } else {
                        if (backtracking(board, row, col + 1)) {
                            return true;
                        }
                    }
                }
            }
            board.at(row).at(col) = '.';
        } else {
            if (col == board.size() - 1) {
                if (backtracking(board, row + 1, 0)) {
                    return true;
                }
            } else {
                if (backtracking(board, row, col + 1)) {
                    return true;
                }
            }
        }

        return false;
    }

    bool isValid(vector<vector<char>> &board, int row, int col) {
        char c = board.at(row).at(col);

        /* 检查列重复 */
        for (int i = 0; i < board.size(); i++) {
            if (board.at(i).at(col) == c && i != row) {
                return false;
            }
        }

        /* 检查行重复 */
        for (int j = 0; j < board.size(); j++) {
            if (board.at(row).at(j) == c && j != col) {
                return false;
            }
        }

        /* 检查组内重复 */
        for (int i = (row / 3) * 3; i < ((row / 3) + 1) * 3; i++) {
            for (int j = (col / 3) * 3; j < ((col / 3) + 1) * 3; j++) {
                if (board.at(i).at(j) == c && i != row && j != col) {
                    return false;
                }
            }
        }

        return true;
    }
};

在这里插入图片描述

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

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

相关文章

优化 Three.js 渲染性能的实用技巧

个人主页&#xff1a; 左本Web3D&#xff0c;更多案例预览请点击》 在线案例 个人简介&#xff1a;专注Web3D使用ThreeJS实现3D效果技巧和学习案例 &#x1f495; &#x1f495;积跬步以至千里&#xff0c;致敬每个爱学习的你。喜欢的话请三连&#xff0c;有问题请私信或者加微…

人工智能-实验三

第三次实验 一.实验目的 ​ 掌握分类算法的算法思想&#xff0c;包括朴素贝叶斯算法&#xff0c;决策树算法等。编写朴素贝叶斯算法进行分类操作。本实验主要是关于朴素贝叶斯算法的实现&#xff0c;在完成本实验时也复习了课程中学习的决策树分类算法的思想。 二.实验原理 …

武汉涉密系统集成资质申报的重点和难点浅析

企业想要申报涉密系统集成资质&#xff0c;首先要确定好申请的级别&#xff1a;涉密系统集成资质分甲级和乙级两个级别&#xff0c;这个一个是看公司体量&#xff0c;另外一个是看公司以后所承接的项目密级级别。级别确定好后还要确定申请哪个类别&#xff0c;涉密系统集成资质…

项目管理专业人员能力评价等级证书(CSPM)的级别介绍

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

使用Go和Gin编写RESTFul API

使用Go和Gin开发RESTFul API 对应的代码仓库地址&#xff1a;gocode 本篇内容介绍如何使用Go和 Gin Web Framework来编写RESTFul API 服务的基础知识。如果你还对Go的基础操作不熟悉的话最好还是先看一下: 入门教程 Gin是一个Go语言的Web开发框架&#xff0c;它简化了构建Web应…

如何实现企业微信扫码登录?

开发内容&#xff1a;实现网页企业微信扫码登录 企业微信提供了OAuth的授权登录方式&#xff0c;可以让从企业微信终端打开的网页获取成员的身份信息&#xff0c;从而免去登录的环节。 企业应用中的URL链接&#xff08;包括自定义菜单或者消息中的链接&#xff09;&#xff0c…

新手git使用记录

文章目录 前言一、下载安装git二、使用git1.基本概念2.git初始化设置3.基本操作3.1、拉取远程仓库代码&#xff0c;修改后在提交3.2、新建分支&#xff0c;提交 总结 前言 几年前在学校还学了git怎么使用&#xff0c;毕业后公司用tfs&#xff0c;这东西真的拉&#xff0c;感觉…

将Apple Vision Pro和visionOS与计算机视觉结合使用

在2023年6月5日的WWDC大会上&#xff0c;苹果宣布推出多年来最大规模的硬件和软件组合产品。今年的“One more thing”&#xff08;“还有一件事”&#xff09;发布是苹果视觉专业版&#xff08;Apple Vision Pro&#xff09;&#xff0c;这是一款集成了苹果生态系统的新型空间…

mybatis多数据源的SQL兼容

背景 最近公司要求支持国产数据库达梦&#xff0c;但达梦与PostgreSQL的语法有一些差异&#xff0c;需要做一些兼容操作。 操作步骤 本文采用dynamic-datasource-spring-boot-starter框架处理多数据源&#xff0c;多数据源配置如下spring:datasource:dynamic:primary: dm #设…

华为OD机试真题B卷 Java 实现【进制转换】,附详细解题思路

一、题目描述 写出一个程序&#xff0c;接受一个十六进制的数&#xff0c;输出该数值的十进制表示。 二、输入描述 输入一个十六进制的数值字符串。 三、输出描述 输出该数值的十进制字符串。不同组的测试用例用\n隔开。 四、解题思路 读取输入的十六进制数值字符串&…

Selenium Python教程第2章

2. Selenium 编程入门 2.1 简单用例 如果你已经安装好了selenium&#xff0c;你可以把下面的python代码拷贝到你的编辑器中 from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver webdriver.Firefox() driver.get("http://www.pytho…

AUTOSAR DoIP介绍

DoIP是什么 DoIP全称是Diagnostic Over IP,顾名思义就是基于IP的诊断,即下图所关联的ISO13400规范,也就是说如果大家想了解DoIP可以详细阅读ISO13400。 根据下图(来自于ISO14229-1),我们可以得到以下两点关系: UDS协议(规范是ISO14229)是统一诊断服务,作为应用层协议…

浏览器相关前端开发事项

文章目录 存储浏览器持久化存储&#xff08;F12->应用->存储&#xff09;浏览器缓存&#xff08;F12->内存&#xff09;浏览器存储管理单位&#xff08;域名/IP为单位&#xff09;区别localStorage VS 浏览器缓存localStorage VS cookies 存储 浏览器持久化存储&…

机器视觉陶瓷板表面划痕丝印检测方法

随着陶瓷制品在建筑、电子、医疗等领域的应用越来越广泛&#xff0c;对陶瓷制品的质量要求也越来越高。而陶瓷制品表面的划痕和丝印等缺陷会降低产品的美观度和质量&#xff0c;甚至会影响产品的安全性和使用寿命。传统的陶瓷板检测方式主要依赖人工目视检测&#xff0c;效率低…

FL Stuido21中文版水果编曲软件下载

FL stuido水果编曲软件做舞曲以及电子乐的利器&#xff0c;即便是在IPAD或者电脑端上操作&#xff0c;都非常的简便。界面逻辑非常友好&#xff0c;做rnb也是很可以的东西。可以作半成品的内容&#xff0c;声音采样方面还行&#xff0c;同样需要接口卡支持。钢琴卷帘操作还算便…

华为OD机试真题 Java 实现【字符串序列判定】【2022Q4 100分】,附详细解题思路

一、题目描述 输入两个字符串a和b&#xff0c;都只包含英文小写字母。a长度<100&#xff0c;b长度<500,000。 判定a是否是b的有效子串。 判定规则&#xff1a; a中的每个字符在b中都能找到&#xff08;可以不连续&#xff09;&#xff0c;且a在b中字符的前后顺序与a中…

FTL潜规则:调优,才是算法精华

前言 在存储领域中有一个FTL的概念&#xff0c;这是一种Flash的内存管理算法&#xff0c;属于各个厂商的核心机密&#xff0c;每个厂商的处理方式不同&#xff0c;有的处理简单&#xff0c;有的处理复杂。 FTL&#xff0c;即Flash Translations layer&#xff0c;也就是闪存转…

wayland浅析之EGL、Opengles、GBM

本文针对不同的compositor&#xff0c;浅析eglopenglesgbm搭配使用情况&#xff1b; 文章目录 1. 前言1.1 问题一&#xff1a;是不是调用eglSwapBuffers函数以后图像就直接显示到屏幕上了&#xff1f;1.2 问题二&#xff1a;EGL基本使用流程&#xff0c;EGL搭配GBM上屏显示基本…

JavaSE06_面向对象之封装

JavaSE-06 [面向对象OOP 封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是…

Servlet、JSP

一、web服务器 1.1 常用服务器产品 Tomcat&#xff08;Apache开源&#xff0c;主流的web服务器之一&#xff0c;多用于javaweb项目开发&#xff09; jetty&#xff08;效率高于Tomcat&#xff09; WebLogic&#xff08;Oracl 收费&#xff09; WebSpera&#xff08;IBM&#xf…