当前位置: 首页 > article >正文

【LeetCode】每日一题 2024_12_1 N 皇后(回溯,DFS)

前言

每天和你一起刷 LeetCode 每日一题~

今日看点:回溯问题必学经典

LeetCode 启动!

题目:N 皇后

代码与解题思路

先读题:同一行同一列,两条对角线上只能同时存在一个皇后,题目要我们找出组成这样棋盘的所有可能性

假设我们遍历每一行每一列,每一行和每一列只放一个皇后,这样我们只需要判断对角线上有没有皇后存在即可,通过回溯遍历所有情况,将合法的情况记录并存入 ans 即可

核心问题:怎么判断对角线上是否存在其他的皇后?

1、对角线:左上到右下, 11, 22,33,行列相减的值是相同的,我们通过 d1 数组记录行列相减的值,这样就能判断当前位置对角线上是否存在皇后了

(注意:如果是 12, 23, 34,这种情况,行列相减是负数,我们可以通过让相减 + n 的做法规避出现负数的情况。)

2、对角线:右上到左下,13, 22, 31,行列相加的值是相同的,我们通过 d2 数组记录行列相加的值,这样就能判断当前位置对角线上是否存在皇后了

代码如下:

func solveNQueens(n int) (ans [][]string) {
    // 经典回溯 N 皇后问题
    col, st := make([]int, n), make([]bool, n)
    d1, d2 := make([]bool, n*2), make([]bool, n*2) // 用来放对角线对应的位置
    var dfs func(int)
    dfs = func(r int) { // 枚举行
        if r == n { // 皇后已经放置完成,将这种情况的棋盘构造并加入 ans 数组
            board := make([]string, n)
            for i, c := range col {
                board[i] = strings.Repeat(".", c)+"Q"+strings.Repeat(".", n-c-1)
            }
            ans = append(ans, board)
        }
        for c, v := range st { // 枚举列
            rc1, rc2 := r-c+n, r+c
            if !v && !d1[rc1] && !d2[rc2] { // 当前位置 && 俩对角线上没有放皇后
                col[r] = c // 在 r 行 c 列上放置皇后
                st[c], d1[rc1], d2[rc2] = true, true, true
                dfs(r + 1)
                st[c], d1[rc1], d2[rc2] = false, false, false // 恢复现场
            }
        }
    }
    dfs(0)
    return ans
}

每天进步一点点,我们明天不见不散~

可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。


http://www.kler.cn/a/418920.html

相关文章:

  • Qt 窗口类型、窗口标志和窗口属性
  • Java 解析离线 MySQL binlog 文件
  • 会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场
  • [网络安全]sqli-labs Less-5 解题详析
  • 【进阶篇-Day15:JAVA线程-Thread的介绍】
  • flink1.6集成doris,并从mysql同步数据到doris
  • 服务器遭受DDoS攻击后如何恢复运行?
  • 【软考速通笔记】系统架构设计师⑨——软件可靠性基础知识
  • 【AI】数据,算力,算法和应用(3)
  • Flutter | 基于函数式编程的通用单选列表设计
  • unity工程转为安卓使用的aar文件
  • 黑马2024AI+JavaWeb开发入门Day05-数据库DDL、DML、DQL飞书作业
  • windows电脑上安装树莓派操作系统
  • Ubuntu问题 -- 使用scp将本机文件传输至ubuntu服务器中
  • Linux 链接概念
  • antd table 自定义表头过滤表格内容
  • flutter 解决webview加载重定向h5页面 返回重复加载问题
  • 电脑cpu带的字母代表啥
  • 牛客面经学习【2024/12/1】
  • 剪映自动批量替换视频、图片素材教程,视频批量复刻、混剪裂变等功能介绍
  • PDF版地形图矢量出现的问题
  • Linux下的root密码重置
  • Dockerfile打包部署
  • MYSQL 什么是内连接 外连接 左连接 右连接?及适用场景
  • C++11新增特性2
  • vue3typescript,shims-vue.d.ts中declare module的vue声明