【代码随想录】算法训练计划30

【代码随想录】算法训练计划30

1、51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

我写的:

我先想了一个思路,然后去看代码回想录,和我想的一样,我取巧了,直接看了她的写的,不过都理解
但也有一点别的收获
他把res设为了全局变量,这样就连&和*都不需要了

收获:

全局的声明:var res [][]string

函数内初始化:res = [][]string{}

这样就不需要取值操作了——就是&,* 这些个

func solveNQueens(n int) [][]string {res := make([][]string, 0)board := make([][]string, n)//下边就是把数组空的位置都初始化为".",代表空for i := 0; i < n; i++ {board[i] = make([]string, n)}for i := 0; i < n; i++{for j := 0; j < n; j++ {board[i][j] = "."}}backtrack(board, 0, &res)return res
}
func backtrack(board [][]string, row int, res *[][]string) {size := len(board)//结束条件是到board,就是到最后一行也添加皇后了if row == size {ans := make([]string, size)for i := 0; i < size; i++ {ans[i] = strings.Join(board[i], "")}*res = append(*res, ans)return}for col := 0; col < size; col++ {if !isValid(board, row, col){continue}board[row][col] = "Q"backtrack(board, row+1, res)board[row][col] = "."}
}
func isValid(board [][]string, row,col int) (res bool){n := len(board)//判断这一列上下行是否有Qfor i := 0; i < row; i++ {if board[i][col] == "Q" {return false}}//判断这一行左右列是否有Qfor i := 0; i < col; i++ {if board[row][i] == "Q" {return false}}//为什么不判断左下线和右下线的原因很简单,因为下边的行还没有给皇后,所以不需要判断//判断左上线是否有Qfor i, j := row, col; i >= 0 && j >= 0; i, j =  i-1, j-1 {if board[i][j] == "Q" {return false}}//判断右上线是否有Qfor i, j := row, col; i >= 0 && j < n; i,j = i-1,j+1 {if board[i][j] == "Q" {return false}}return true
}
2、37. 解数独

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

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

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

提示:

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我第一次只能写到如下这么多了

//做一个二维的字典或者数组,方便第三个判断,0-02,1-35,2-68或者0-13,1-46,2-79,
jgg := [3][2]{{0,2},{3,5},{6,8},
}
func solveSudoku(board [][]byte)  {list := make([]int, 0)backtrack(list []int, &board)return board
}
func backtrack(board *[][]byte) {//到第九行结束,一行一行的填入,每一行要填入9个数字//记住,这个数独只有唯一一个解if Index == 9 {ans := make([]int, len(list))copy(ans, list)*board}for i := 0; i <= 9; i++ {//我的难点就是不知道怎么去知道这个行,列,然后去嗯...给他整上数字}
}//判断所填入数字是否满足条件
func mz(board *[][]byte, shu,row,col int) bool{//左右这个数没出现过,i不变,j变,情况下,可以添加这个数字for j := 0; j < 9 ; j++ {if board[row][j] == shu {return false}}//上下这个数没出现过, i变,j不变for i := 0; i < 9; i++ {if board[i][col] == shu {return false}}//判断他所在区域的9个格子是否出现-除以三-判断是第几个格子h := row/3l := col/3for i := jgg[h][0]; i <= jgg[h][1] {for j := jgg[l][0]; j <= jgg[l][1]{if board[i][j] == shu {return false}}}return true
}

看题解理解后如下啊:

思路:

  1. 第一步咱们很清楚的知道,需要判断加入的数是否满足条件,所以写了mz函数,感觉我判断格子的方法有点臃肿了
  2. 好,开始正题,进入backtrack
  3. 为什么这次没有和solveSudoku分开单独写一个呢,在于这个题目人家不要返回值,而且填写的是board,二维的,咱要是在分开的backtrack函数用*[][]int,其实,传不进去单个值,所以直接在solveSudoku函数先声明,再初始化,再使用
    4.好了开始说说初始化,也就是backtrack的主体,首先是这个双重for循环,记得水仙花数,打印图形吗,这类的题目就是用了双重for循环来代表要添加的元素所在的行列
  4. 接着判断不是’.'的不需要变成数字,跳过当前循环,进入下一层
  5. 重重点开始
  6. 首先是’1’-'9’是选择列表,但是因为board是[][]byte类型,在你追加的时候需要类型转换byte(shu),判断是否满足mz的传参也需要
  7. 接着是循环,不过这里用了if,多了一层判断,为真就return true
  8. 接着回溯,都知道
  9. 接着下边又有两个return,说实话,我还不太理解这三个return到底有什么妙用
  10. 关于方格的判断条件啊,还是人家代码随想录写得好,值得看看,不过别担心,不难理解
func solveSudoku(board [][]byte)  {var backtrack func(board [][]byte) boolbacktrack = func(board [][]byte) bool {//双重for循环,代表行列for  i := 0; i < 9; i++ {for j := 0; j < 9; j++ {//只有当前位置为.的时候才可以添加数字,否则跳过这个数if board[i][j] != '.'{continue}//重点,填写1-9是选择列表,for shu := '1'; shu <= '9'; shu++ {if mz(board,byte(shu),i,j) == true {//追加board[i][j] = byte(shu)//循环if backtrack(board) == true {return true}//回溯board[i][j] = '.'}}return false}}return true}backtrack(board)
}
func backtrack(board *[][]byte) {}//判断所填入数字是否满足条件
func mz(board [][]byte, shu byte, row,col int) bool {//做一个二维的字典或者数组,方便第三个判断,0-02,1-35,2-68或者0-13,1-46,2-79,jgg := [3][2]int{{0,2},{3,5},{6,8},}//左右这个数没出现过,i不变,j变,情况下,可以添加这个数字for j := 0; j < 9 ; j++ {if board[row][j] == shu {return false}}//上下这个数没出现过, i变,j不变for i := 0; i < 9; i++ {if board[i][col] == shu {return false}}//判断他所在区域的9个格子是否出现-除以三-判断是第几个格子h := row/3l := col/3for i := jgg[h][0]; i <= jgg[h][1]; i++ {for j := jgg[l][0]; j <= jgg[l][1]; j++{if board[i][j] == shu {return false}}}return true
}

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

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

相关文章

分布式锁3: zk实现分布式锁

一 zk 实现分布式锁 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 2..znode节点类型&#xff1a; 永久节点&#xff1a;create /pa…

优秀智慧园区案例 - 上海世博文化公园智慧园区,先进智慧园区建设方案经验

一、项目背景 世博文化公园是上海的绿色新地标&#xff0c;是生态自然永续、文化融合创新、市民欢聚共享的大公园。作为世博地区的城市更新项目&#xff0c;世博文化公园的建设关乎上海城市风貌、上海文化展示、城市生态环境、市民游客体验、上海服务品牌等&#xff0c;被赋予…

依托数据、平台、知识增强等优势 夸克大模型大幅降低问答幻觉率

“大模型时代&#xff0c;夸克有巨大机会创造出革新性搜索产品。”11月22日&#xff0c;夸克大模型公布了其面向搜索、生产力工具和资产管理助手的大模型技术布局。数据显示&#xff0c;夸克千亿级参数大模型登顶C-Eval和CMMLU两大权威榜单&#xff0c;夸克百亿级参数大模型同样…

电大搜题——让学习变得轻松高效

作为一名现代学者&#xff0c;您一定时刻关注着教育领域的进展和创新。今天&#xff0c;我将向大家介绍一个名为“电大搜题”的神奇工具&#xff0c;它将为您的学习之路带来一场完美的革命。 在快节奏的现代社会中&#xff0c;学习已经成为每个人追求成功的必经之路。然而&…

【数据结构】动态顺序表详解

目录 1.顺序表的概念及结构 2.动态顺序表的实现 2.1创建新项目 2.2动态顺序表的创建 2.3接口的实现及测其功能 2.3.1初始化 2.3.2尾插 2.3.3头插 2.3.4尾删&头删 2.3.5打印&从任意位置插入 2.3.6删除任意位置的数据 2.3.7查找 2.3.8销毁顺序表 3.结语 He…

java项目之社区互助平台(ssm+vue)

项目简介 社区互助平台实现了以下功能&#xff1a; 1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果有中意的社区互助信息时&#xff0c;要登录注册&#xff0c;只有注册成功才有的权限。2、管理员的功能及权限 用户信息的添…

react大文件上传

目录 大文件上传优点&#xff1a; 大文件上传缺点: 大文件上传原理&#xff1a; 为什么要用md5 实现流程&#xff1a; 部分代码1&#xff1a; 部分代码2&#xff1a;​ 大文件上传优点&#xff1a; 文件太大分片上传能加快上传速度,提高用户体验能断点续传 如果上次上传失败…

简单工程模式

代码实现 //simpleFactory.h #ifndef _SimpleFactory_H_ #define _SimpleFactory_H_#include <iostream> #include <exception> #include <string>using namespace std;class Operation { protected:double _numberA 0;double _numberB 0; public:Operat…

MybatisX插件使用

Mybatis X插件 MybatisX 是一款基于 IDEA 的快速开发插件&#xff0c;为效率而生。MybatisX官网&#xff1a;https://baomidou.com/pages/ba5b24/#%E5%8A%9F%E8%83%BD安装方法&#xff1a;打开 IDEA&#xff0c;进入 File -> Settings -> Plugins&#xff0c;输入 mybat…

三维控件中定位一个点_vtkPointWidget

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题&#xff1a;允许用户使用三维光标在三维空间中定位一个点。关键类vtkPointWidget , 光标具有轮廓边界框、轴对齐十字准线和轴阴影&#xff…

AD7021C 触摸感应加灯光调节芯片IC 可用于触摸台灯、触摸玩具灯等

AD7021C触摸感应 IC 是为实现人体触摸界面而设计的集成电路。可替代机械式轻触按键&#xff0c;实现防水防尘、密封隔离、坚固美观的操作界面。使用该芯片可以实现 LED 灯光亮度调节&#xff0c;方案所需的外围电路简单&#xff0c;操作方便。确定好灵敏度选择电容&#xff…

【华为OD题库-033】经典屏保-java

题目 DVD机在视频输出时&#xff0c;为了保护电视显像管&#xff0c;在待机状态会显示"屏保动画”&#xff0c;如下图所示,DVD Logo在屏幕内来回运动&#xff0c;碰到边缘会反弹:请根据如下要求&#xff0c;实现屏保Logo坐标的计算算法 1、屏幕是一个800 * 600像素的矩形&…

Vue3 provide 和 inject 实现祖组件和后代组件通信

provide 和 inject 能够实现祖组件和其任意的后代组件之间通信&#xff1a; 一、provide 提供数据 我们在祖组件中使用provide 将数据提供出去。 使用provide 之前需要先进行引入&#xff1a; import { provide } from "vue"; 语法格式如下&#xff1a; provide(&q…

山西电力市场日前价格预测【2023-11-23】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-23&#xff09;山西电力市场全天平均日前电价为148.77元/MWh。其中&#xff0c;最高日前电价为420.40元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

微信小程序开发学习——页面布局、初始导航栏与跳转

1.盒模型 要求实现效果如图所示&#xff1a; 所有WXML元素都可以看作盒子&#xff0c;在WXSS中"box model”这一术语是用来设计和布局时使用盒模型本质上是一个盒子&#xff0c;封装周围的WXML元素它包括: 边距&#xff0c;边框&#xff0c;填充和实际内容&#xff0c;模…

RAW RGB YUV数据差异

目录 颜色与色彩空间 RAW图像 RGB图像 YUV图像 颜色与色彩空间 颜色 颜色是人眼感知到的现象&#xff0c;它是由光波的频率和强度所决定的&#xff0c;仅仅存在于人的眼睛和大脑中&#xff0c;因此为了方便描述颜色&#xff0c;引入了色彩空间。色彩空间 色彩空间&#xff…

C语言--数组与指针--打印字符串的n种方式

一.知识背景 一维数组名的含义 arr一般表示数组的起始地址&#xff08;除了两种例外&#xff09; 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表…

和鲸 × 暨大经管:高效 SAAS 服务持续赋能交叉学科应用型数据人才培养

随着新一轮科技革命与产业变革的加速演进&#xff0c;拥有学科背景的应用型数据科学人才逐渐成为我国政产学研各界的人力资源需求重点。为响应需求&#xff0c;国家愈发重视新生力量数据思维与意识的培养&#xff0c;各高校也纷纷探索如何以新兴信息技术赋能传统主流学科。 在…

达索系统SOLIDWORKS流体分析网格划分失败,大多是这2种原因

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件&#xff0c;该软件功能强大、操作人性化&#xff0c;快速轻松的分析产品内部或外部流体的流动情况&#xff0c;以用来改善产品性能和功能。 当流体分析运行网格划分时&#xff0c;提示失败。 这是由于凸起面与圆…

【LeetCode刷题】--43.字符串相乘

43.字符串相乘 方法一&#xff1a;做加法&#xff0c;模拟竖式乘法的方法计算乘积 class Solution {public String multiply(String num1, String num2) {if(num1.equals("0") || num2.equals("0")){return "0";}String res "0";//nu…