n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线)。

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

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

在线评测地址:LintCode 领扣

样例1:

输入:1
输出:[["Q"]]

样例2:

输入:4
输出:
[// Solution 1[".Q..","...Q","Q...","..Q."],// Solution 2["..Q.","Q...","...Q",".Q.."]
]

算法:dfs(回溯法)

题目分析

这个问题要求把n个皇后放在一个nXn的棋盘上,使得任何两个皇后都不能相互攻击,即它们不能同行,不能同列,也不能位于同一条对角线上。对于n=1,问题的解很简单,而且很容易看出对于n=2和n=3来说,这个问题是无解的。所以我们考虑4皇后问题,并用回溯法对它求解。

算法思路

  • 因为每个皇后都必须分别占据一行,我们需要做的不过是棋盘上的每个皇后分配一列。
  • 下面我们用4皇后的求解过程来讲解算法思路:

从空棋盘开始,然后把皇后1 放到它所在行的第-一个可能位置上,也就是第一-行第一列。对于皇后2,在经过第-列和第二列的失败尝试之后,我们把它放在第一个可能的位置,就是格子(2, 3),位于第二行第三列的格子。这被证明是一个死胡同,因为皇后3将没有位置可放。所以,该算法进行回溯,把皇后2放在下一个可能位置(2,4)上。这样皇后3就可以放在(3, 2),这被证明是另一个死胡同。该算法然后就回溯到底,把皇后1移到(1,2)。 接着皇后2到(2,4), 皇后3到(3,1), 而皇后4到(4, 3), 这就是该问题的一个解。

  • 整个过程实际上就是一个状态树的遍历过程
  • 下图为状态树

代码思路

  • 按行摆放,在确定一个皇后应该摆的列时,需要检查当前列是否合法,如果合法,则将皇后放置在当前位置,并进行递归,回溯。每行都摆满皇后时,则产生了一种解法,将所有解法收集并返回。
  • 合法性判断方法:当前将要摆放皇后的位置和其他已摆放皇后的位置不能在同一列,且不能在同一条斜线上。这里判断是否在同一条斜线上可以通过两个皇后的位置横坐标之差和纵坐标之差的绝对值是否相等来判断。

复杂度分析

  • 空间复杂度:O(N!)
  • 时间复杂度:O(N!)
  • 放置第一个皇后有 N 种可能,放置两个皇后不超过N(N-2)种可能,放置三个皇后不超过N(N - 2)(N - 4)种可能 ,以此类推。
class Solution {/*** Get all distinct N-Queen solutions* @param n: The number of queens* @return: All distinct solutions* For example, A string '...Q' shows a queen on forth position*/List<List<String>> solveNQueens(int n) {// result用于存储答案List<List<String>> results = new ArrayList<>();if (n <= 0) {return results;}search(results, new ArrayList<Integer>(), n);return results;}// search函数为搜索函数,n表示已经放置了n个皇后,cols 表示每个皇后所在的列private void search(List<List<String>> results, List<Integer> cols, int n) {// 若已经放置了n个皇后表示出现了一种解法,绘制后加入答案resultif (cols.size() == n) {results.add(Draw(cols));return;}// 枚举当前皇后放置的列,若不合法则跳过for (int colIndex = 0; colIndex < n; colIndex++) {if (!isValid(cols, colIndex)) {continue;}// 若合法则递归枚举下一行的皇后cols.add(colIndex);search(results, cols, n);cols.remove(cols.size() - 1);}}// isValid函数为合法性判断函数private boolean isValid(List<Integer> cols, int col) {int row = cols.size();for (int rowIndex = 0; rowIndex < cols.size(); rowIndex++) {//若有其他皇后在同一列或同一斜线上则不合法if (cols.get(rowIndex) == col) {return false;}if (row + col == rowIndex + cols.get(rowIndex)) {return false;}if (row - col == rowIndex - cols.get(rowIndex)) {return false;}}return true;}// Draw函数为将 cols 数组转换为答案的绘制函数private List<String> Draw(List<Integer> cols) {List<String> result = new ArrayList<>();for (int i = 0; i < cols.size(); i++) {StringBuilder sb = new StringBuilder();for (int j = 0; j < cols.size(); j++) {sb.append(j == cols.get(i) ? 'Q' : '.');}result.add(sb.toString());}return result;}
}

更多题解参考:九章算法

n皇后问题c语言_九章算法 | N皇后问题相关推荐

  1. 八皇后时间复杂度_九章算法 | N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线). 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的 ...

  2. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  3. 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串

    给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...

  4. 编号是i的结点所在的层次号是_九章算法 | 微软面试题:二叉树的锯齿形层次遍历...

    给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 在线评测地址:LintCode 领扣 样例 1: 输入:{1,2,3} 输出:[[1],[3,2]] ...

  5. 多个数字数组_九章算法 | 谷歌面试题:多个数组的交集

    给出多个数组,求它们的交集.输出他们交集的大小. 在线评测地址:LintCode 领扣 样例 1: 输入: [[1,2,3],[3,4,5],[3,9,10]]输出: 1解释:只有3出现在三个数组中. ...

  6. arrays合并两个数组_九章算法 | 字节跳动面试题:合并k个排序数组

    将 k 个有序数组合并为一个大的有序数组. 在线评测地址:LintCode 领扣 样例 1: Input: [[1, 3, 5, 7],[2, 4, 6],[0, 8, 9, 10, 11]] Out ...

  7. n皇后问题c语言_用栈解决N皇后问题(C语言)

    点击上方蓝字关注"程序员Bob"呀~ 孩子不是图画练习册,你不能随心所欲涂上你想要的颜色. --<追风筝的人> 问题描述:输入一个整数n,输出对应的n皇后问题的解的个数 ...

  8. 匹配左括号或者右括号js_九章算法 | 蚂蚁金服面试题:有效的括号字符串

    [题目描述] 给定一个只包含三种类型字符的字符串:'(',')'和 '*', 编写一个函数来检查该字符串是否有效. 我们通过以下规则定义字符串的有效性: 1.任何左括号 '('必须有一个相应的右括号' ...

  9. 发现红芯丑闻的 Touko 正在九章算法做实习工程师,你想认识一下吗?

    专栏 | 九章算法 网址 | www.jiuzhang.com 近日,国产软件界出现一则重磅新闻,融资2.5亿.号称国内首个自主研发的浏览器内核红芯Redcore被爆多次解压后竟然发现了 Chrome ...

最新文章

  1. BC28、BC95通过LWM2M连接电信AEP(ctwing)
  2. cnsul linux环境后台启动_Redis安装和配置(Windows和Linux)
  3. scala不可变和可变_Scala使期货变得轻松
  4. 哈啰出行回应单车违规投放:将尽快缴纳罚金 积极整改
  5. python的8种标准数据类型有哪些_Python的八种数据类型
  6. Ng第一课:引言(Introduction)
  7. 为无线网路上好锁,WEP、WPA无线加密对比
  8. 二叉树前中后/层次遍历的递归与非递归形式(c++)
  9. 个人作业-2016.12.2
  10. 计算机任务栏的透明颜色设置,详细教您让Win10任务栏全透明_一分钟让Win10任务栏全透明...
  11. 如何用算法预测世界杯?
  12. 一键刷入twrp_红米Note8Pro最简单一键获取ROOT权限教程-管理自启更省电
  13. Transportation Research(TR)系列主编汇总
  14. 十天就能缓解颈椎病的保健操(图)
  15. 感谢未曾谋面的小战士
  16. 北京军区技侦局_校庆70周年系列学术活动之六:
  17. VPP学习(二)VPP安装
  18. 【JavaScript-进阶】详解数据类型,内存分配,API元素对象获取
  19. 64位计算机 内存,Win7 64位/32位系统支持多大内存?64/32位系统有什么区别?
  20. [书籍翻译]12周撰写期刊文章 学术出版成功指南——第 X 周 回应编辑的决定

热门文章

  1. Mybatis_别名的使用
  2. JavaScript之子类构建工具
  3. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
  4. DOM方式解析XML文件实例
  5. jquery $.fn $.fx $.extend
  6. IOCP编程小结(中)
  7. Hyper-V应用指南之3-理解并配置Hyper-V虚拟网络[转]
  8. windows 下借助7zip实现命令行解压缩
  9. [USACO4.1]麦香牛块Beef McNuggets By cellur925
  10. 中山纪念中学培训DAY1