[LeetCode] N皇后问题
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皇后问题的更多相关文章
- LeetCode N皇后 & N皇后 II
题目链接:https://leetcode-cn.com/problems/n-queens/ 题目链接:https://leetcode-cn.com/problems/n-queens-ii/ 题 ...
- [LeetCode] N-Queens II N皇后问题之二
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- [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 ...
- Leetcode之回溯法专题-52. N皇后 II(N-Queens II)
Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...
- Leetcode之回溯法专题-51. N皇后(N-Queens)
Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...
- [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 ...
- [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 ...
- [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 ...
- LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...
随机推荐
- 【转】C语言中动态分配数组
原文地址:http://blog.chinaunix.net/uid-11085590-id-2914577.html 如何动态的定义及使用数组呢?记得一般用数组的时候都是先指定大小的.当时问老师,老 ...
- vue 从入门到精通(一)
很早之前就想开一系列有关vue的博客,奈何太忙了,哈哈(爱信不信)...刚刚收到消息vue2.5发布了,哎!还是应该加快一下步伐,要不就与社会脱节了.这次采用小步慢跑的形式一点一点总结vue,第一篇先 ...
- JS难点--面向对象(封装)
我觉得js的难点之一就是面向对象编程. 面向对象 它是一种编程思想,它在写法上比面向过程相对来说复杂一些: 以下是我学习中关于面向对象的知识点总结: 1.什么是对象 从广义上说,"一切皆 ...
- 25.Linux-Nor Flash驱动(详解)
1.nor硬件介绍: 从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数据,需要有命令才行 1.1其中我们2440的 ...
- 优先队列(存储结构数组)--Java实现
/*优先队列--是对队列的一种改进 *要存储的数据存在优先级--数值小的优先级高--在队头 *优先队列的实现 *1.数组:适合数据量小的情况(没有用rear+front实现) *优先队列头在items ...
- svn: Working copy 'D:\workspace\web\..\..\images' is too old (format 10, created by Subversion 1.6
问题:SVN同步或者提交的时候出现类似错误信息: 解决:找到对应目录,删除隐藏文件.SVN 重新提交或更新
- Python Linear algebra
Linear algebra 1.模块文档 NAME numpy.linalg DESCRIPTION Core Linear Algebra Tools ---------------------- ...
- glog 使用
glog 使用 来源:http://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html 一.安装配置 1.简介 google 出的 ...
- Problem B: 开个餐馆算算账
Description 小明创业了!他开了一家餐馆,每天客人还挺多的.每天下班后,他都要算算今天总共收入多少钱,但是手工算太麻烦了,所以他来向你求助了. Input 第1行N>0,表示餐馆提供N ...
- CSS3 动画 animation和@keyframes
CSS3 @keyframes 规则 如需在 CSS3 中创建动画,您需要学习 @keyframes 规则. @keyframes 规则用于创建动画.在 @keyframes 中规定某项 CSS 样式 ...