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

LeetCode Python - 51. N 皇后

目录

  • 题目
  • 答案
  • 运行结果


题目

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

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

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

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

示例 1:
在这里插入图片描述

输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[[“Q”]]

提示:

  • 1 <= n <= 9

答案

我们定义三个数组 col, dg 和 udg,分别表示列、正对角线和反对角线上的是否有皇后,如果位置 (i,j) 有皇后,那么 col[j], dg[i+j] 和 udg[n−i+j] 都为 1。另外,我们用一个数组 g 记录当前棋盘的状态,初始时 g 中的所有元素都是 ‘.’。

接下来,我们定义一个函数 dfs(i),表示从第 i 行开始放置皇后。

在 dfs(i) 中,如果 i=n,说明我们已经完成了所有皇后的放置,我们将当前 g 放入答案数组中,递归结束。

否则,我们枚举当前行的每一列 j,如果位置 (i,j) 没有皇后,即 col[j], dg[i+j] 和 udg[n−i+j] 都为 0,那么我们可以放置皇后,即把 g[i][j] 改为 ‘Q’,并将 col[j], dg[i+j] 和 udg[n−i+j] 都置为 1,然后继续搜索下一行,即调用 dfs(i+1),递归结束后,我们需要将 g[i][j] 改回 ‘.’ 并将 col[j], dg[i+j] 和 udg[n−i+j] 都置为 0。

在主函数中,我们调用 dfs(0) 开始递归,最后返回答案数组即可。

时间复杂度 (n2 ×n!),空间复杂度 O(n)。其中 n 是题目给定的整数。

class Solution(object):def solveNQueens(self, n):""":type n: int:rtype: List[List[str]]"""def dfs(i):if i == n:ans.append(["".join(row) for row in g])returnfor j in range(n):if col[j] + dg[i + j] + udg[n - i + j] == 0:g[i][j] = "Q"col[j] = dg[i + j] = udg[n - i + j] = 1dfs(i + 1)col[j] = dg[i + j] = udg[n - i + j] = 0g[i][j] = "."ans = []g = [["."] * n for _ in range(n)]col = [0] * ndg = [0] * (n << 1)udg = [0] * (n << 1)dfs(0)return ans

运行结果

在这里插入图片描述

相关文章:

  • 分布式搜索引擎Elasticsearch中各种类型节点的作用
  • 【考研数学】打基础用张宇《30讲》还是武忠祥《基础篇》?
  • 安徽省月度降水量分布数据
  • Kubernetes kafka系列 | k8s部署kafka+zookeepe集群(可外部通信)
  • 解释器模式(Interpreter Pattern)
  • 【Spring Boot 3】【JSON】读取JSON文件
  • 在springboot中Redis数据与MySQL数据的一致性方案思考和案例
  • 2024.3.13 C++
  • PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
  • 2.案例、鼠标时间类型、事件对象参数
  • kubernetes学习总结
  • Java特性之设计模式【组合模式】
  • 基于C++的一种字符串切分方法及示例代码
  • 升级版本彻底解决bootstrap-table-fixed-columns固定列后行对不齐问题
  • 滴滴 Flink 指标系统的架构设计与实践
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Angularjs之国际化
  • django开发-定时任务的使用
  • flutter的key在widget list的作用以及必要性
  • JavaScript HTML DOM
  • PHP 7 修改了什么呢 -- 2
  • SQL 难点解决:记录的引用
  • Vultr 教程目录
  • 给github项目添加CI badge
  • 给初学者:JavaScript 中数组操作注意点
  • 什么软件可以剪辑音乐?
  • 数组大概知多少
  • 再谈express与koa的对比
  • 《天龙八部3D》Unity技术方案揭秘
  • FaaS 的简单实践
  • 阿里云移动端播放器高级功能介绍
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #etcd#安装时出错
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)WCF的Binding模型
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (四)JPA - JQPL 实现增删改查
  • (学习日记)2024.01.19
  • (转)setTimeout 和 setInterval 的区别
  • (转)重识new
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [2016.7 day.5] T2
  • [2019/05/17]解决springboot测试List接口时JSON传参异常