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

news2025/1/17 1:18:11

【代码随想录】算法训练计划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)
    //判断这一列上下行是否有Q
    for i := 0; i < row; i++ {
        if board[i][col] == "Q" {
            return false
        }
    }
    //判断这一行左右列是否有Q
    for i := 0; i < col; i++ {
        if board[row][i] == "Q" {
            return false
        }
    }
  	//为什么不判断左下线和右下线的原因很简单,因为下边的行还没有给皇后,所以不需要判断
    //判断左上线是否有Q
    for i, j := row, col; i >= 0 && j >= 0; i, j =  i-1, j-1 {
        if board[i][j] == "Q" {
            return false
        }
    }
    //判断右上线是否有Q
    for 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/3
    l := col/3
    for 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) bool
    backtrack = 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/3
    l := col/3
    for 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.coloradmin.cn/o/1239566.html

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

相关文章

【鸿蒙生态千帆起】HarmonyOS 系统级地图与位置服务,赋能广大开发者

在"与 HarmonyOS 同行&#xff0c;开放生态&#xff0c;共赢未来"为主题的 HUAWEI Developer Day&#xff08;简称 HDD&#xff09;沙龙中&#xff0c;Petal Maps 为开发者们带来了在 HarmonyOS 下地图领域的最新技术探索与实践成果。 得益于 HarmonyOS 一次开发多端…

小程序存在优惠卷遍历,但是歪了

进入小程序&#xff0c;因为是一个小商城&#xff0c;所以照例先查看收货地址是否存在越权&#xff0c;以及能否未授权访问&#xff0c;但是发现不存在这些问题&#xff0c;所以去查看优惠卷 进入领券中心&#xff0c;点击领取优惠券时抓包 发现数据包&#xff0c;存在敏感参数…

【java】想要限制每次查询的结果集不能超过10000行,该如何实现?

文章目录 前言 前言 对于一些Saas化软件&#xff0c;当某个租户在执行查询SQL时&#xff0c;如果查询条件出现了BUG&#xff0c;导致去查了所有租户的数据&#xff0c;这种情况是非常严重的&#xff0c;此时就需要在架构层面做限制&#xff0c;禁止一些特殊SQL的执行&#xff…

.Net6使用WebSocket与前端进行通信

1. 创建类WebSocketTest&#xff1a; using System.Net.WebSockets; using System.Text;namespace WebSocket.Demo {public class WebSocketTest{//当前请求实例System.Net.WebSockets.WebSocket socket null;public async Task DoWork(HttpContext ctx){socket await ctx.We…

还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!

文章目录 前言摩尔斯电码Python实现摩斯密码对照表加密解密测试 完整代码总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Py…

数学建模之拟合及其代码

发现新天地&#xff0c;欢迎访问Cr不是铬的个人网站 引言 与插值问题不同&#xff0c;在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数&#xff08;曲线&#xff09;&#xff0c;使得该曲线在某种准则下与所有的数据点最为接近&#xff0c;即曲线拟合…

【Docker】Docker安装Nginx配置静态资源

1.下载镜像 2.创建nginx配置文件 3.创建nginx容器运行 4.配置nginx静态资源 1.下载镜像 Dockerhub官网&#xff1a;Docker docker pull nginx docker pull nginx下载最新版本 默认latest 下载指定版本docker pull nginx:xxx 2.创建nginx配置文件 启动容器之前要创建nginx…

数字图像处理(冈萨雷斯)学习笔记

目录 一.机器视觉和计算机视觉二.图像处理基础1.什么是图像2.如何访问图像 三.图像仿射变换四.灰度变换 一.机器视觉和计算机视觉 机器视觉(Machine Vision,MV)和计算机视觉(Computer Vision&#xff0c;CV)的区别和联系&#xff1a; 机器视觉更注重广义图像信号(激光&#xff…

2023 年收入最高的 10 种编程语言 Java 排第 10 位

在过去的一年中&#xff08;从2022年10月1日到2023年10月1日&#xff09;&#xff0c;DevJobsScanner进行了全球范围内超过1,000万份开发工作机会的分析&#xff0c;以深入了解市场动向、最热门的编程语言以及薪酬最高的趋势。值得注意的是&#xff0c;这项研究的焦点仅集中在美…

2023.11.22 数据仓库2-维度建模

目录 1.数仓建设方案 2.数仓结构图,项目架构图 2.1项目架构图 2.2数仓结构图 3.建模设计 4.维度建模 什么是事实表: 什么是维度表: 数据发展模式y以及对应的模型 5.数仓建设规范 数据库划分规范 表命名规范 表字段类型规范 1.数仓建设方案 ODS: 源数据层(临时存储层) 贴…

不停的挖掘硬盘的最大潜能

从 NAS 上退休的硬盘被用在了监控的存储上了。 随着硬盘使用寿命的接近尾声&#xff0c;感觉就是从高附加值数据到低附加值数据上。监控数据只会保留那么几个月的时间&#xff0c;很多时候都会被覆盖重新写入。 有人问为什么监控数据不保留几年的&#xff0c;那是因为监控数据…

个人博客项目 - 测试报告

文章目录 一、项目背景二、测试报告功能测试1.编写测试用例2.登录测试3.编写文章测试4.查看文章测试5.删除文章测试7.注销登录测试 自动化测试性能测试1.VUG2.进行场景设计3.生成性能测试报告 总结 本文开始 一、项目背景 通过学习测试相关的知识&#xff0c;动手实践并测试一…

【人工智能入门学习资料福利】

总目录如下&#xff08;部分截取&#xff09;&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1bfDVG-xcPR3f3nfBJXxqQQ?pwdifu6 提取码&#xff1a; ifu6

记录小白第一次EDUsrc:任意密码漏洞

目录 一、漏洞说明&#xff1a; 二、漏洞复现&#xff1a; 三、漏洞修复建议&#xff1a; 一、漏洞说明&#xff1a; xxxx学院身份认证系统有严重的逻辑设计缺陷&#xff1a;账户登录、手机登录、密码找回三个接口找到n个逻辑漏洞包括任意账号密码修改、信息泄露&#xff0…

在中国企业出海的大浪潮下,亚马逊云科技提供遍及全球的基础设施和技术支持

中国技术出海是中国企业更高层次更高质量的全球化。在人类文明发展史上&#xff0c;凝聚中国古人智慧结晶的造纸术、印刷术、火药、指南针等&#xff0c;曾为中国技术出海写下过浓墨重彩的一笔。在今天&#xff0c;如金山办公、店匠科技、ADVANCE.AI等公司又以技术立业&#xf…

Apache POI简介

三十二、Apache POI 32.1 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用POI在Java程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI都是用于操作Excel文件。 Apache POI 的应用场…

百度发布Q3财报:AI原生应用驱动业绩增长 公司股价应声涨超5%

作为中国科技巨头&#xff0c;百度一直走在人工智能&#xff08;AI&#xff09;技术的前沿。 11月21日&#xff0c;百度发布的第三季度财务报告再次证明了其在AI领域的领先地位。报告显示&#xff0c;第三季度百度实现营收344.47亿元&#xff0c;归属于百度的净利润&#xff0…

最易上手的电子期刊制作工具,快来使用!

快节奏时代&#xff0c;纸质书籍逐渐淡出人们的视野&#xff0c;取而代之的就是电子刊物制作。而电子期刊开始寻求更多的互动和丰富的内容形式&#xff0c;给人以良好的阅读体验。 如何制作呢&#xff1f;便成为了当下必须要学会的新技能&#xff0c;接下来分享一个比PPT更简单…

【电子通识】USB3.0和USB2.0有什么区别?

版本 USB2.0是2000年4月27日由USB-IF组织提出了USB2.0总线协议规范。 USB3.0是2008年11月17日由USB-IF组织提出了超高速USB3.0规范。 图标对比 USB2.0的标志就是和USB1.1的标志基本上没啥区别&#xff0c;还是以前的那个样子&#xff0c;使用黑色颜色用标识 USB3.0它有一个S…

[原创]解决老款AMD CPU在Win10/Win11无故重启的问题.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…