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. asp.net core2.0网站的环境搭建和网站部署

    使用到的软件和硬件 1.       centos7.3服务器一台 2.       xshell.xftp 3.       vs2017 4.       .NET Core   1. 安装 li ...

  2. Memory Analyzer Tool 使用手记

    最近一段时间一直在研究热部署,热部署中涉及到一个比较头痛的问题就是查内存泄露(Memory Leak),于是乎在研究热部署的过程中,干的最多的一件事就是查内存泄露.       查内存泄露,最开始尝试 ...

  3. 程序员节应该写博客之.NET下使用HTTP请求的正确姿势

    程序员节应该写博客之.NET下使用HTTP请求的正确姿势 一.前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的分析后对HttpClient有了一定的了 ...

  4. [ACdream]小晴天老师系列——竖式乘

    题目链接:http://acdream.info/contest?cid=1269#problem-C Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学 ...

  5. HttpComponents 发送post get 请求

    1.场景描述 使用Apache开源组织中的HttpComponents,完成对http服务器的访问功能. 2.HttpComponents项目的介绍 HttpComponents项目就是专门设计来简化 ...

  6. jquery的2.0.3版本源码系列(7):3043行-3183行,deferred延迟对象,对异步的统一管理

    目录 part1 deferred延迟对象 part2  when辅助方法 网盘源代码 链接: https://pan.baidu.com/s/1skAj8Jj 密码: izta part1 defe ...

  7. git常用命令集合

    git命令 git init:创建一个仓库并在目录下新建一个.git的文件(初始化一个git仓库) 注:.git文件在工作区,是一个隐藏文件(用ls -ah命令查看),但是它不算工作区,而是git 的 ...

  8. Pie

    Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...

  9. 【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap

    一.前言 在上一篇随笔中,我们分析了HashMap的源码,里面涉及到了3个钩子函数,用来预设给子类--LinkedHashMap的调用,所以趁热打铁,今天我们来一起看一下它的源码吧. 二.Linked ...

  10. 路由知识 静态路由 rip eigrp ospf

    第1章 路由选择原理 1.1 几个概念 1.1.1 被动路由协议 用来在路由之间传递用户信息 1.1.2 主动路由协议 用于维护路由器的路由表 R2#show ip route Codes: C - ...