leetcode_37.解数独

devtools/2024/10/19 6:21:06/

37. 解数独

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

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

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

backTrack 方法:

  1. 这是一个递归方法,用于回溯填充数独。它使用两层嵌套循环来遍历数独的每个格子。
  2. 如果当前格子为空(即 board[i][j] == '.'),则尝试填充数字 '1' 到 '9'。
  3. 对于每个尝试填充的数字,首先调用 Judge 方法来判断当前数字是否符合数独的规则。
  4. 如果当前数字符合数独的规则,则将其填充到当前格子,并递归调用 backTrack 方法填充下一个格子
  5. 如果递归调用返回 true,表示数独已经填充完成,则直接返回 true,结束递归。
  6. 如果递归调用返回 false,表示当前填充的数字导致后续无法填充完成,则回溯到上一步,尝试下一个数字。
  7. 如果所有数字都尝试过了仍然无法填充完成,则返回 false

Judge 方法:

  1. 这是一个辅助方法,用于判断当前填充的数字是否符合数独的规则。
  2. 它通过检查当前行、当前列和当前小九宫格来确定当前数字是否与已有的数字冲突。
  3. 如果存在冲突,则返回 false,否则返回 true
class Solution {public void solveSudoku(char[][] board) {backTrack(board);}public boolean backTrack(char[][] board) {for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] != '.') continue;for (char k = '1'; k <= '9'; k++) {if(!Judge(board, i, j, k))continue;board[i][j] = k;if (backTrack(board)) return true;board[i][j] = '.';}return false;}}return true;}public boolean Judge(char[][] board, int x, int y, char k) {for (int i = 0; i < 9; i++) if (board[x][i] == k) return false;for (int i = 0; i < 9; i++) if (board[i][y] == k) return false;int nx = (x / 3) * 3;int ny = (y / 3) * 3;for (int i = nx; i < nx + 3; i++) {for (int j = ny; j < ny + 3; j++) {if (board[i][j] == k) return false;}}return true;}}

http://www.ppmy.cn/devtools/26003.html

相关文章

基于STM32的环境检测系统与仿真

基于STM32的环境检测系统与仿真 1、OLED显示温湿度、光照强度以及CO浓度 2、按键调整阈值。超限之后相应LED灯亮起蜂鸣器鸣叫 3、WiFi模块显示不同数值、阈值以及当前设定值 总结 项目本身还是比较好的。 禁止转载&#xff01;&#xff01;&#xff01;

吐槽3家知名的AI智能体

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我花了2天时间&#xff0c;把松松最近1年的爆款文案关键词情绪口头禅整理出来&#xff0c;4000多字的Prompt&#xff0c;都是一点点打出来的&#xff0c;再投喂到AI大模型里。使用的平台包括&#xff1a;通义千问、…

28377d升级

dsp 28377在线升级 实例总结_f021_cpu0_w1_register_address-CSDN博客

十大USDT交易平台大全XEX交易所

USDT是一种基于比特币区块链网络的加密代币&#xff0c;主要运用于数字货币交易平台&#xff0c;以稳定币为主。USDT的核心价值在于其与真实货币的固定兑换比率1:1&#xff0c;所以被称为Tether。随着加密货币市场的不断壮大&#xff0c;越来越多的交易平台开始支持USDT&#x…

使用groovy+spock优雅的进行单测

使用groovyspock优雅的进行单测 1. groovyspock示例1.1 简单示例1.2 增加where块的示例1.3 实际应用的示例 2. 单测相关问题2.1 与SpringBoot融合2.2 单测数据与测试数据隔离2.3 SQL自动转换&#xff08;MySQL -> H2&#xff09; 参考 Groovy是一种基于JVM的动态语言&#x…

从车规传感器发展的正反面,看智驾发展的“胜负手”

北京车展进程过半&#xff0c;雷军和周鸿祎成为车展新晋“网红”的同时&#xff0c;智能驾驶成为观众讨论最务实的话题之一。端到端自动驾驶、城市NOA这些炙手可热的话题&#xff0c;占据了大部分的关注度。 但在高阶智能驾驶之外&#xff0c;智能驾驶同样具有频繁使用需求的低…

车载气象站:可移动监测的气象站

TH-CZ5车载气象站是一种专门针对车辆、船舶等应急环境检测设备而设计的可移动监测的气象站。 一、系统介绍 车载气象站系统采用先进的高精度GPS及三轴电子罗盘&#xff0c;可实现车行驶时的风速、风向检测。整机为野外型设计&#xff0c;同时还可对气温、相对湿度、雨量、气压…

红魔8/8Pro/8SPro手机升级安卓14版RedMagic9.0系统+降级出厂救砖刷机

红魔8系列手机也终于引来了安卓14系统的更新&#xff0c;该系统为最新的RedMagic9.0&#xff0c;目前属于公测版本&#xff0c;如果你已经升级了官方UI8.0最新版系统&#xff0c;并且拥有公测资格&#xff0c;可以直接在线检测到最新版UI9.0系统。9.0系统目前对比之前的8.0的版…