LeetCode上面关于N皇后有两道题目:
51 N-Queens:https://leetcode.com/problems/n-queens/description/

52 N-Queens II:https://leetcode.com/problems/n-queens-ii/description/

两道题目其实差不多,一题是只要返回解的个数就可以了,一题是返回所有的解,做起来一模一样。

什么是N皇后问题?我们需要在一个N*N的棋盘上,放置N个皇后,使这些皇后不能互相攻击(即两个皇后之间不能处于同一行、同一列或者是同一斜线上),我们要求满足这个条件的所有解。

我采用的是回溯法去解决N皇后问题:

我们先在第一列放置一个皇后,然后在第二列与第一列不冲突的位置再放皇后,在第三列与第一列、第二列不冲突的位置放皇后……执行这样的操作,一直到第N列,我们就得到一个解了。

怎么回溯呢?我们可以想象成一棵树。假设我们在第一列的第一行放置了皇后,然后递归模拟了所有情况后,把第一列的第一行的皇后放到第二行,继续递归模拟所有情况。一直到把所有解都得出来。

下面看看LeetCode的具体题目:

51 N-Queens:

题目:

代码:

class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<string> queens(n);
for (int i = ; i < n; i++) {
queens[i] = "";
for (int j = ; j < n; j++) {
queens[i] += ".";
}
}
helper(res, queens, , n);
return res;
}
void helper(vector<vector<string>> &res, vector<string> queens, int j, int n) {
if (j == n) {
res.push_back(queens);
return;
}
for (int i = ; i < n; i++) {
if (isValid(queens, i, j)) {
queens[i][j] = 'Q';
helper(res, queens, j + , n);
queens[i][j] = '.';
}
} }
bool isValid(vector<string> s, int i, int j) {
for (int k = ; k < s.size(); k++) {
if (i != k && s[k][j] == 'Q') return false;
}
for (int k = ; k < s.size(); k++) {
if (j != k && s[i][k] == 'Q') return false;
}
for (int m = i + , n = j + ; m < s.size() && n < s.size(); m++, n++) {
if (s[m][n] == 'Q') return false;
}
for (int m = i + , n = j - ; m < s.size() && n >= ; m++, n--) {
if (s[m][n] == 'Q') return false;
}
for (int m = i - , n = j - ; m >= && n >= ; m--, n--) {
if (s[m][n] == 'Q') return false;
}
for (int m = i - , n = j + ; m >= && n < s.size(); m--, n++) {
if (s[m][n] == 'Q') return false;
}
return true;
}
};

52 N-Queens II:

题目:

代码:

class Solution {
public:
int totalNQueens(int n) {
vector<string> queens(n);
for (int i = ; i < n; i++) {
queens[i] = "";
for (int j = ; j < n; j++) {
queens[i] += '';
}
}
int res = ;
helper(res, queens, , n);
return res;
}
void helper(int &res, vector<string> queens, int j, int n) {
if (j == n) {
res++;
return;
}
for (int i = ; i < n; i++) {
if (isValid(queens, i, j)) {
queens[i][j] = '';
helper(res, queens, j + , n);
queens[i][j] = '';
}
}
}
bool isValid(vector<string> queens, int i, int j) {
for (int k = ; k < queens.size(); k++) {
if (queens[i][k] == '' && k != j) return false;
}
for (int k = ; k < queens.size(); k++) {
if (queens[k][j] == '' && k != i) return false;
}
for (int m = i - , n = j - ; m >= && n >= ; m--, n--) {
if (queens[m][n] == '') return false;
}
for (int m = i + , n = j - ; m < queens.size() && n >= ; m++, n--) {
if (queens[m][n] == '') return false;
}
for (int m = i - , n = j + ; m >= && n < queens.size(); m--, n++) {
if (queens[m][n] == '') return false;
}
for (int m = i + , n = j + ; m < queens.size() && n < queens.size(); m++, n++) {
if (queens[m][n] == '') return false;
}
return true;
}
};

除了原来的函数,我们用到了一个用于回溯的helper函数,一个用于检测当前位置是否可放置皇后的函数。

[LeetCode] N皇后问题的更多相关文章

  1. LeetCode N皇后 & N皇后 II

    题目链接:https://leetcode-cn.com/problems/n-queens/ 题目链接:https://leetcode-cn.com/problems/n-queens-ii/ 题 ...

  2. [LeetCode] N-Queens II N皇后问题之二

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  3. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  4. Leetcode之回溯法专题-52. N皇后 II(N-Queens II)

    Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...

  5. Leetcode之回溯法专题-51. N皇后(N-Queens)

    Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...

  6. [LeetCode] 52. N-Queens II N皇后问题之二

    The n-queens puzzle is the problem of placing nqueens on an n×n chessboard such that no two queens a ...

  7. [LeetCode] 51. N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  8. [LeetCode] 52. N-Queens II N皇后问题 II

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  9. LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...

随机推荐

  1. LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  2. css3+div画大风车

    今天已经礼拜三了,周天小颖家的佩佩就要结婚啦,小颖要去当伴娘了,哈哈哈哈哈哈,想想都觉得乐开了花,不过之前她给我说让我当她伴娘时,我说我要减肥,不然她那么瘦弱,我站旁边就感觉像一个圆滚滚的小皮球,小颖 ...

  3. CSS基础:基础和语法

    **CSS语法** CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明.选择器通常是您需要改变样式的 HTML 元素.```selector {declaration1; declarati ...

  4. Windows环境下多线程编程原理与应用读书笔记(3)————Windows环境中的多线程实现(3)

    纤程 纤程(fiber): 相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber显示至另一合作纤程,以实现合作纤程之间的协同.线程是在Wi ...

  5. HDU4027 Can you answer these queries?(线段树 单点修改)

    A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use ...

  6. Handshakes

    Description Last week, n students participated in the annual programming contest of Marjar Universit ...

  7. 记录下 Markdown 语法

    github上常用markdown语法:Mastering Markdown 目录 0. 目录 1. 锚点 2.标题 3.超链接 3.1.行内式 3.2.自动链接 4.列表 4.1.有序列表 4.2. ...

  8. 关于Mybaits映射一点心得

    本人的第一篇手写博客 -日期2017-11-06 在写博客之前一直使用手写笔记!!! 以前一直使用Hibernate,基本上没用过Mybatis,工作中需要做映射关系,简单的了解下Mybatis的映射 ...

  9. 解决Qt编译动态链接库could not find or load the Qt platform plugin "windows" in.问题

    最近用Qt5做了一个项目的界面,在编译成可执行文件EXE之后,运行文件,提示: This application failed to start because it could not find o ...

  10. SVN提交文件的时候过滤指定文件

    如果使用TortoiseSVN作为客户端的话,可以在TortoiseSVN右键菜单中的 "设置"(settings)--常规设置(General)--全局忽略样式里设置(Globa ...