7.14解数独(LC37-H)

算法:

二维递归(递归时需要两层for循环)

一个for循环放行

另一个for循环放列

画树:

因为这个树形结构太大了,我抽取一部分,如图所示:

回溯三部曲:

1.确定函数参数和返回值

返回值:

boolean。因为只要解一个数独就可以返回了,不用一直搜取结果。

如果要把整棵树的所有结果都返回,才用void

参数:

char[][] board。题目自带的。

2.确定终止条件

本题递归不用终止条件

递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满当然好了,说明找到结果了),所以不需要终止条件!

3.单层递归逻辑

        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++){ // (i, j) 这个位置放k是否合适if (isValidSudoku(i, j, k, board)){board[i][j] = k;if (solveSudokuHelper(board)){ // 如果找到合适一组立刻返回return true;}board[i][j] = '.';//找不到就放"."}}// 9个数都试完了,都不行,那么就返回falsereturn false;// 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!// 那么会直接返回, 「这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!」}}// 遍历完没有返回false,说明找到了合适棋盘位置了return true;}

判断棋盘是否合法

  • 同行是否重复
    for (int i = 0; i < 9; i++) { // 判断行里是否重复if (board[row][i] == val) {return false;}}

  • 同列是否重复
    for (int j = 0; j < 9; j++) { // 判断列里是否重复if (board[j][col] == val) {return false;}}

  • 9宫格里是否重复
   int startRow = (row / 3) * 3;int startCol = (col / 3) * 3;for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复for (int j = startCol; j < startCol + 3; j++) {if (board[i][j] == val ) {return false;}}}return true;}

正确代码:

class Solution {public void solveSudoku(char[][] board) {backtracking(board);}boolean backtracking (char[][] board){//二维递归for (int row = 0; row < 9; row++){for (int col = 0; col < 9; col++){//若该位置有数字了,就跳出本层循环if  (board[row][col] != '.') continue;//循环放置数字1-9for (char k = '1'; k <= '9'; k++){if (isValid(row, col, k, board)){board[row][col] = k;//如果找到合适一组立刻返回if (backtracking(board)) return true;}board[row][col] = '.';}
// 9个数都试完了,都不行,那么就返回false
// 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!
// 那么会直接返回, 「这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!return false;}}return true;}boolean isValid(int row, int col, char var, char[][]board){//先判错//同行不重复  for (int i = 0; i <9; i++){if (board[row][i] == var) return false;}//同列不重复for (int i = 0; i <9; i++){if (board[i][col] == var) return false;}//9宫格不重复 int startrow = (row/3)*3; //  `/` 表示整数除法。比如,row=0,startrow=0; row=3,startrow=3int startcol = (col/3)*3;for (int i= startrow; i < startrow+3; i++){for (int j= startcol; j < startcol+3; j++){if (board[i][j] == var)  return false;}}return true;}}

这道题好难,不太会写代码,边看正确答案边写的

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《MySQL系列-InnoDB引擎04》MySQL表相关介绍

文章目录 第四章 表1 索引组织表2 InnoDB逻辑存储结构2.1 表空间2.2 段2.3 区2.4 页2.5 行2.6 拓展&#xff1a;MySQL的varchar(n)能存储几个字符&#xff1f;占多少字节&#xff1f; 3 InnoDB行记录格式4 文件格式5 约束5.1 数据完整性5.2 约束的创建和查找5.3 约束和索引的区…

CSS 放大旋转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-scale-up: isAnimating }"><!-- 元素内容 -->&l…

设计模式:简单工厂模式

这里写目录标题 工厂模式简介核心角色&#xff1a;实现 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封…

《新课程研究》是什么级别的期刊?是正规期刊吗?能评职称吗?

《新课程研究》刊物以服务基础教育改革和发展为宗旨&#xff0c;突出新理论、新观点、新课程、新实践&#xff0c;促进教学教研、课程建设&#xff0c;推动教改&#xff0c;是教育教学科研工作者、各级教育 行政部门、各级各类学校教师及关心教育发展者了解、研究、助推课改的平…

用 Python 抓取 bilibili 弹幕并分析!

01 实现思路 首先&#xff0c;利用哔哩哔哩的弹幕接口&#xff0c;把数据保存到本地。接着&#xff0c;对数据进行分词。最后&#xff0c;做了评论的可视化。 02 弹幕数据 平常我们在看视频时&#xff0c;弹幕是出现在视频上的。实际上在网页中&#xff0c;弹幕是被隐藏在源代码…

13.Go 异常

1、宕机 Go语言的类型系统会在编译时捕获很多错误&#xff0c;但有些错误只能在运行时检查&#xff0c;如数组访问越界、空指针引用等&#xff0c;这些运行时错误会引起宕机。 一般而言&#xff0c;当宕机发生时&#xff0c;程序会中断运行&#xff0c;并立即执行在该gorouti…

【AI辅助创作】商场中令对手胆颤的神秘杀手

进入21世纪&#xff0c;我们生活在一个被数据包围的世界。每天&#xff0c;无数的信息在互联网上流动&#xff0c;构成了所谓的“大数据”。在这个大数据时代&#xff0c;谁是真正的杀手&#xff1f;企业如何利用大数据来成功地了解和应对其竞争对手&#xff1f;这是我们今天要…

电路分析竟然这么简单?还可以用软件仿真~

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

C++八股学习心得.4

1.C 类 & 对象 C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在…

一起offsetLeft值引发的样式错乱问题

问题描述&#xff1a; 首先我们来看一下正常样式和异常样式&#xff0c;正常样式的左侧菜单会正常显示出来&#xff0c;而异常样式的左侧菜单会被覆盖&#xff1b; 正常的样式&#xff1a; 异常的样式&#xff1a; 问题探索&#xff1a; 左边的间距其实跟通过读取最外层元素…

caj转换成pdf有哪些方法?

caj转换成pdf有哪些方法&#xff1f;PDF是一个被广泛支持的文件格式&#xff0c;这种格式基本上在所有的操作系统和设备上都是支持使用的&#xff0c;也能够将PDF文件打开和查看的&#xff0c;相比于caj文件&#xff0c;它就只能通过一下特定的软件或者是插件才能够将caj打开或…

C++ 实现对战AI五子棋

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 前言&#xff1a; 为了能够快速上手一门语言&#xff0c;我们往往在学习了基本语法后&#x…