【代码随想录】算法训练计划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.hqwc.cn/news/207737.html

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

相关文章

为UE和Unity开发者准备的Godot指南

为UE和Unity开发者准备的Godot指南 ——两位大哥打架&#xff0c;请带上我 这两天游戏行业又开始热闹了&#xff0c;昨天两条信息直接刷爆朋友圈&#xff0c;最大的两家游戏引擎公司怼起来了。 《为Unity开发者准备的虚幻引擎指南》&#xff1a; 为Unity开发者准备的虚幻引擎指…

【UE】用样条线实现测距功能(上)

目录 效果 步骤 一、创建样条网格体组件3D模型 二、实现点击连线功能 三、实现显示两点间距离功能 效果 步骤 一、创建样条网格体组件3D模型 创建一个圆柱模型&#xff0c;这里底面半径设置为10mm&#xff0c;高度设置为1000mm 注意该模型的坐标轴在如下位置&#xff1…

智能导视电子指路牌是什么?

SVIP-3800系列智能电子指路牌也称智慧指路灯杆&#xff0c;智能指路牌&#xff0c;导航立柱&#xff0c;多功能指示牌&#xff0c;多功能路标&#xff0c;智能指路机器人&#xff0c;智能导视指路牌&#xff0c;问路导航机器人&#xff0c;智能路牌&#xff0c;叁仟智慧路牌、智…

Vue3常用操作

一、Vue3项目构建 1、安装最新版本vue npm create vuelatest 2、选择需要的配置 3、进入项目 cd 项目名称 4、下载依赖 npm install 5、启动项目 npm run dev

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 在使用 WAL 的系统中&#xff0c;所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

028 - STM32学习笔记 - ADC结构体学习(二)

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…

xss-labs靶场6-10关

文章目录 前言一、靶场6-10关1、关卡62、关卡73、关卡84、关卡95、关卡10 总结 前言 此文章只用于学习和反思巩固xss攻击知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试&#xff01;&#xff01;&#xff01; …

读不懂客户,就不足以谈商业成功

数字化的背后&#xff0c;是对顾客心理和行为的深度洞察。因此&#xff0c;品牌营销运营数字化&#xff0c;不仅仅是为了收集转化率数据&#xff0c;也需要通过设计数据指标&#xff0c;更深地了解顾客。 门店管理也是如此&#xff0c;打造未来空间的数智化管理方式&#xff0c…

Qt实现图片旋转的几种方式(全)

目录 一、用手搓&#xff08;QPainter&#xff09; 二、使用 QGraphicsView 和 QGraphicsPixmapItem 三、使用 QTransform 实现图像旋转 四、利用 OpenGL 实现旋转图像的效果有几种不同的方法&#xff0c;其中常见的包括&#xff1a; 手动旋转绘制&#xff1a; 使用 QPaint…

如何解决msvcp110.dll丢失问题,分享5个有效的解决方法

最近&#xff0c;我在使用电脑时遇到了一个令人头疼的问题——msvcp110.dll丢失。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些有效的方法来修复丢失的msvcp110.dll文件。那么&#xff0c;msvcp110.dll到底是什么呢&#xff1f;…

TypeScript 学习笔记 第二部分 webpack 创建typescript项目

【视频链接】尚硅谷TypeScript教程&#xff08;李立超老师TS新课&#xff09; 创建webpack 项目 IDE&#xff1a;webstorm 新建一个空的项目运行npm init初始化项目目录结构 1. 安装 webpack&#xff1a;构建工具webpack-cli&#xff1a; webpack的命令行工具typescript&am…

8款宝藏级别的云端设计工具推荐

早年&#xff0c;UI设计师选择的工具有限&#xff0c;功能相对单一&#xff0c;大多数在线原型设计工具都是国外的&#xff0c;语言和网络都增加了设计工作的负担。如今&#xff0c;国内外有许多在线原型设计工具&#xff0c;不仅可以在浏览器上使用&#xff0c;而且还具有团队…