37. 解数独 - 力扣(LeetCode)

news2024/10/5 17:19:00

基础知识要求:

Java: 方法、for循环、if else语句、数组

Python: 方法、for循环、if else语句、列表

题目: 

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

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

  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] 是一位数字或者 '.'
  • 题目数据 保证 输入数独仅有一个解

思路解析:

这个解题思路是一个典型的回溯算法在数独求解问题上的应用,它非常直观且易于理解。下面是对这个解题思路的总结:

  1. 初始化
    • 提供一个初始的数独板(在这个例子中是通过一个二维列表表示的)。
    • 如果数独板没有完全填充(即含有.作为占位符),则需要进行求解。
  2. 定义is_valid函数
    • 这是一个辅助函数,用于检查在给定位置(row, col)填入数字num是否有效。
    • 检查包括:当前行、当前列以及所在的3x3宫格内是否已存在该数字。
  3. 定义solve_sudoku函数
    • 这是求解数独的核心函数,它使用回溯法来尝试填充每一个空格。
    • 对于数独板上的每一个空格(即值为.的位置):
      • 尝试填入数字1到9。
      • 如果填入某个数字后,数独仍然有效(通过is_valid函数检查),则继续递归地求解剩余的空格。
      • 如果递归求解成功(即找到了一个解),则返回True。
      • 如果递归求解失败(即当前数字不合适),则回溯,将该空格重新置为.,并尝试下一个数字。
    • 如果尝试完所有数字后仍然没有找到解,则返回False。
    • 如果所有空格都成功填充,则返回True,表示找到了一个解。
  4. 求解与输出
    • 调用solve_sudoku函数来求解数独。
    • 如果求解成功,则打印出解出的数独板;否则,输出“无解”。

Java代码示例:

public class SudokuSolver {  
  
    // 检查数字在行、列和3x3宫格内是否有效  
    public static boolean isValid(char[][] board, int row, int col, char num) {  
        // 检查行  
        for (int i = 0; i < 9; i++) {  
            if (board[row][i] == num) {  
                return false;  
            }  
        }  
  
        // 检查列  
        for (int i = 0; i < 9; i++) {  
            if (board[i][col] == num) {  
                return false;  
            }  
        }  
  
        // 检查3x3宫格  
        int startRow = 3 * (row / 3);  
        int startCol = 3 * (col / 3);  
        for (int i = 0; i < 3; i++) {  
            for (int j = 0; j < 3; j++) {  
                if (board[i + startRow][j + startCol] == num) {  
                    return false;  
                }  
            }  
        }  
  
        return true;  
    }  
  
    // 递归求解数独  
    public static boolean solveSudoku(char[][] board) {  
        for (int i = 0; i < 9; i++) {  
            for (int j = 0; j < 9; j++) {  
                if (board[i][j] == '.') {  
                    for (char num = '1'; num <= '9'; num++) {  
                        if (isValid(board, i, j, num)) {  
                            board[i][j] = num;  
  
                            // 递归尝试下一个空格  
                            if (solveSudoku(board)) {  
                                return true;  
                            }  
  
                            // 回溯  
                            board[i][j] = '.';  
                        }  
                    }  
  
                    // 尝试完所有数字都不可行,说明当前空格无解,返回false  
                    return false;  
                }  
            }  
        }  
  
        // 所有空格都填满了,说明找到解了  
        return true;  
    }  
  
    // 主函数,用于测试  
    public static void main(String[] args) {  
        char[][] 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'}  
        };  
  
        if (solveSudoku(board)) {  
            // 格式化输出  
            for (char[] row : board) {  
                for (char num : row) {  
                    System.out.print(num + " ");  
                }  
                System.out.println();  
            }  
        } else {  
            System.out.println("无解");  
        }  
    }  
}

Python代码示例:

def is_valid(board, row, col, num):  
    # 检查行中是否已存在该数字  
    for i in range(9):  
        if board[row][i] == num:  
            return False  
    # 检查列中是否已存在该数字  
    for i in range(9):  
        if board[i][col] == num:  
            return False  
    # 检查3x3宫格中是否已存在该数字  
    start_row = 3 * (row // 3)  
    start_col = 3 * (col // 3)  
    for i in range(3):  
        for j in range(3):  
            if board[i + start_row][j + start_col] == num:  
                return False  
    return True
  
def solve_sudoku(board):  
    for i in range(9):  
        for j in range(9):  
            if board[i][j] == '.':  
                for num in ['1', '2', '3', '4', '5', '6', '7', '8', '9']:  
                    if is_valid(board, i, j, num):  
                        board[i][j] = num  
                        if solve_sudoku(board):  
                            return True  
                        # 如果当前数字不合法,回溯  
                        board[i][j] = '.'  
                # 尝试完所有数字都不可行,说明无解  
                return False  
    # 所有空格都填满了,说明找到解了  
    return True  
  
# 示例输入  
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"]]  
  
# 转换为二维列表  
board = [list(map(str, row)) for row in board]  
  
# 求解数独  
if solve_sudoku(board):  
    # 格式化输出  
    for row in board:  
        print(row)  
else:  
    print("无解")

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

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

相关文章

上交提出TrustGAIN,提出6G网络中可信AIGC新模式!

月16日至18日&#xff0c;2024全球6G技术大会在南京召开。会上&#xff0c;全球移动通信标准制定组织3GPP&#xff08;第三代合作伙伴计划&#xff09;的3位联席主席分享了3GPP6G标准时间表&#xff1a; 2024年9月&#xff0c;启动6G业务需求研究&#xff1b; 2025年6月&…

代码随想录算法训练营第36期DAY35

DAY35 122买卖股票的最佳时机ii 很巧妙&#xff0c;也很难想到&#xff1a;计算每天的利润&#xff08;今天卖出&#xff0c;昨天买入的利润&#xff09;&#xff0c;只取正数相加。 class Solution {public: int maxProfit(vector<int>& prices) { int…

Broker的主从架构

为了保证MQ的数据不丢失而且具备一定的高可用性&#xff0c;所以一般都是得将Broker部署成Master-Slave模式的&#xff0c;也就是—个Master Broker对应一个Slave Broker Master需要在接收到消息之后&#xff0c;将数据同步给Slave&#xff0c;这样一旦Master Broker挂了&#…

YOLOV10阅读总结

GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection YOLOv10 - Ultralytics YOLO Docs https://arxiv.org/pdf/2405.14458 论文地址 最近yolo又出了个yolov10了&#xff0c;不得不感慨CV是真卷&#xff0c;毕竟yolov9也才没多久。记录一下阅读笔记。…

【JVM】一次JVM内存泄露分析处理

一次内存泄露分析 背景情况 编写了一个大数据基础组件的可用性监控程序&#xff0c;采用Bootstrap监测端口的方式&#xff0c;使得方法常驻&#xff08;main线程常驻&#xff09;&#xff0c;通过一个调度线程ScheduledThreadPoolExecutor&#xff0c;定时的调动监测任务。 …

短视频拍摄方式有哪些:四川鑫悦里文化传媒有限公司

​短视频拍摄方式有哪些 在数字化时代&#xff0c;短视频以其短小精悍、传播迅速的特点&#xff0c;成为了人们表达自我、分享生活的重要工具。然而&#xff0c;想要制作出引人入胜的短视频&#xff0c;除了创意和构思&#xff0c;拍摄方式的选择也至关重要。四川鑫悦里文化传…

详谈 Java中的list.forEach()和list.stream().forEach() 异同点

涉及的文章链接&#xff1a;ArrayList 循环Remove遇到的坑 一、想总结本篇博客的原因 在日常开发中&#xff0c;需要对集合数据进行或多或少的赋值修改&#xff0c;那么循环赋值或者做一些处理就是最常见的一种操作了&#xff0c;但是用习惯了stream流&#xff0c;所以在循环的…

聚合网卡和Wondershaper限速的一些问题(速度减半问题)

首先我们来了解一下聚合网卡&#xff1a; 聚合网卡&#xff0c;又称为链路聚合组&#xff08;LAG, Link Aggregation Group&#xff09;、端口汇聚&#xff08;Port Trunking&#xff09;、以太通道&#xff08;Ethernet Bonding&#xff09;等&#xff0c;是一种网络技术&…

【OpenCV】图形绘制与填充

介绍了绘制、填充图像的API。也介绍了RNG类用来生成随机数。相关API&#xff1a; line() rectangle() circle() ellipse() putText() 代码&#xff1a; #include "iostream" #include "opencv2/opencv.hpp"using namespace std; using namespace cv…

Git和plink

安装git的话首先进入到git官网进行下载Git - Downloading Package (git-scm.com) &#xff0c;点击便会自动进行下载。 安装plink时也是根据自己电脑的版本号选择进行安装&#xff0c;我的是windows的64位&#xff0c;由此选择以上版本进行安装&#xff0c;这一个下载完成之后不…

react中子传父信息

思路是&#xff1a; 在父组件定义一个函数接受参数&#xff0c;接收的参数用于接收子组件的信息&#xff0c;把函数传给子组件&#xff0c;子组件调用父亲传来的函数并把要告诉父亲的话传到函数中&#xff0c;就实现了子传父消息 import { useState } from reactimport { use…

JavaWeb笔记整理+图解——服务器渲染技术之EL表达式与JSTL

上一篇我们讲解了什么是服务器渲染技术和jsp&#xff0c;今天我来整理一下EL表达式和JSTL的笔记与图解&#xff0c;让我们的jsp页面更加的简洁与可维护。 没看过上一期的小伙伴可以看上一期的笔记&#xff1a; JavaWeb笔记全整理——JSP服务器渲染技术-CSDN博客 一、EL表达式…

揭开 SOCKS5 有哪些强大的功能?

在在线隐私和安全领域&#xff0c;SOCKS5 是一种多功能且功能强大的协议&#xff0c;为用户提供了一种无缝的方式来加密他们的互联网流量、绕过防火墙并以增强的匿名性和灵活性访问网络。无论您是担心在线监控、地理封锁还是数据隐私&#xff0c;了解如何利用 SOCKS5 的功能都可…

Apache-Doris单机部署

参考&#xff1a; 快速体验 Apache Doris - Apache Doris 1、Apache Doris是一款 基于MPP架构的高性能、实时的分析型数据库&#xff0c;以高效、简单、统一的特点被人们所熟知&#xff0c;仅需 亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点…

ue引擎游戏开发笔记(46)——简单UI设计

1.需求分析&#xff1a; 玩家操作界面应该有基本的准星和血量显示等内容&#xff0c;告知玩家角色的基本状态。 2.操作实现&#xff1a; 1.较为简单的内容&#xff0c;在控件面板建立相应内容&#xff0c;之后链接到游戏中即可&#xff01; 2.先做准星&#xff0c;在画布上搞个…

Day 56 647. 回文子串 516.最长回文子序列

回文子串 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a;“abc”输出&#xff1a;3解释&#xf…

蓝桥杯Web开发【大学组:国赛】2022年真题

1.分一分 如果给你一个数组&#xff0c;你能很快将它分割成指定长度的若干份吗&#xff1f; 1.1 题目问题 请在 js/index.js 文件中补全函数 splitArray 中的代码&#xff0c;最终返回按指定长度分割的数组。 具体要求如下&#xff1a; 将待分割的&#xff08;一维&#x…

“星战之父”乔治・卢卡斯吐槽好莱坞“几乎没有原创思维”,AI 将“不可避免”用于电影制作

《星球大战》系列的创作者乔治・卢卡斯&#xff08;George Lucas&#xff09;在 1977 年奠定了电影制作传奇人物的地位&#xff0c;他对当今电影的状况及其发展方向有一些自己的看法。 他在 2024 年戛纳电影节上谈到了当前的电影行业。现年 80 岁的卢卡斯在接受法国媒体 Brut …

STM32建立工程问题汇总

老版本MDK&#xff0c;例如MDK4 工程内容如下&#xff1a; User文件夹中存放main.c文件&#xff0c;用户中断服务函数&#xff08;stm32f1xx.it.c&#xff09;&#xff0c;用户配置文件&#xff08;stm32f1xx_hal_conf.h&#xff09;等用户程序文件&#xff0c;或者mdk启动程序…

GIT提交:.husky/pre-commit: line 2: .husky/_/husky.sh: No such file or directory

GIT提交&#xff1a;.husky/pre-commit: line 2: .husky/_/husky.sh: No such file or directory 一些项目添加了代码提交校验和格式化&#xff0c;在windows下会忽略.husky下文件提交导致git数据丢失。 处理方案&#xff1a; 方案01&#xff1a;补齐缺失的文件 1.1 项目根…