leetcode 51. N-Queens 、52. N-Queens II
51. N-Queens
使用isValid判断当前的位置是否合法
每次遍历一行,使用queenCol记录之前行的存储位置,一方面是用于判断合法,另一方面可以根据存储结果输出最终的结果
棋盘的斜线都是45°的,所以两个位置x的差值和y的差值应该是相等的
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> > result;
if(n <= )
return result;
vector<int> queenCol(n,-);
int curRow = ;
solveNQueens(curRow,result,queenCol,n);
return result;
}
void solveNQueens(int curRow,vector<vector<string> >& result,vector<int>& queenCol,int n){
if(curRow == n){
vector<string> res(n,string(n,'.'));
for(int i = ;i < n;i++)
res[i][queenCol[i]] = 'Q';
result.push_back(res);
return;
}
for(int i = ;i < n;i++){
if(isValid(queenCol,curRow,i)){
queenCol[curRow] = i;
solveNQueens(curRow + ,result,queenCol,n);
queenCol[curRow] = -;
}
}
}
bool isValid(vector<int> queenCol,int row,int col){
for(int i = ;i < row;i++){
if(queenCol[i] == col || abs(row - i) == abs(col - queenCol[i]))
return false;
}
return true;
}
};
52. N-Queens II
这个题更像是51题的简化版,51题需要把所有的可能性输出出来,这个题只需要输出不同的个数。代码基本和51题差不多,依旧使用dfs遍历就好。
注意:result加了引用! curRow没加引用!
result最终要作为返回值获得结果,所有的搜索情况都公用这个result,但是curRow,不同的搜索,搜索的值应该不一样
class Solution {
public:
int totalNQueens(int n) {
if(n <= )
return ;
vector<int> queenCol(n,-);
int result = ;
int curRow = ;
totalNQueens(n,queenCol,result,curRow);
return result;
}
void totalNQueens(int n,vector<int>& queenCol,int& result,int curRow){
if(curRow == n){
result++;
return;
}
for(int i = ;i < n;i++){
if(isValid(queenCol,curRow,i)){
queenCol[curRow] = i;
totalNQueens(n,queenCol,result,curRow+);
queenCol[curRow] = -;
}
}
}
bool isValid(vector<int>& queenCol,int row,int col){
for(int i = ;i < row;i++){
if(queenCol[i] == col || abs(row - i) == abs(col - queenCol[i]))
return false;
}
return true;
}
};
另一种写法:
这种写法也是正确的,将queenCol的引用去掉,然后将queenCol[curRow] = -1;删掉,因为实际上不会回调回来。
如果你想用回调回来的,就必须queenCol[curRow] = -1
如果不用回调,其实queenCol[curRow] = -1这句话删掉不删掉都是正确的,因为不影响原来调用的函数中queenCol的结果。
class Solution {
public:
int totalNQueens(int n) {
if(n <= )
return ;
vector<int> queenCol(n,-);
int result = ;
int curRow = ;
totalNQueens(n,queenCol,result,curRow);
return result;
}
void totalNQueens(int n,vector<int> queenCol,int& result,int curRow){
if(curRow == n){
result++;
return;
}
for(int i = ;i < n;i++){
if(isValid(queenCol,curRow,i)){
queenCol[curRow] = i;
totalNQueens(n,queenCol,result,curRow+);
//queenCol[curRow] = -1;
}
}
}
bool isValid(vector<int>& queenCol,int row,int col){
for(int i = ;i < row;i++){
if(queenCol[i] == col || abs(row - i) == abs(col - queenCol[i]))
return false;
}
return true;
}
};
leetcode 51. N-Queens 、52. N-Queens II的更多相关文章
- leetcode 51. N皇后 及 52.N皇后 II
51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...
- Leetcode之回溯法专题-52. N皇后 II(N-Queens II)
Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...
- leetcode 169. Majority Element 、229. Majority Element II
169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...
- leetcode 79. Word Search 、212. Word Search II
https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...
- leetcode 54. Spiral Matrix 、59. Spiral Matrix II
54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...
- leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...
- leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String
344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...
- leetcode 131. Palindrome Partitioning 、132. Palindrome Partitioning II
131. Palindrome Partitioning substr使用的是坐标值,不使用.begin()..end()这种迭代器 使用dfs,类似于subsets的题,每次判断要不要加入这个数 s ...
- leetcode 280.Wiggle Sort 、324. Wiggle Sort II
Wiggle Sort: 注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求. 解法一错误版本: 如果nums的长度是4,这种情况下nums[i+1]会越界.但是如果你用 ...
- leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST
1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...
随机推荐
- Install/Remove of the Service Denied!
在windos 的cmd下安装mysql 在mysql的bin目录下面执行: mysqld --install 报错: 信息如下一: Install/Remove of the Service Den ...
- Java构造器的调用顺序
<Java编程思想>中对构造器的调用顺序有如下描述: “构造器实际上是static方法,只不过该static声明是隐式的.” “基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次 ...
- Oracle数据库如何提高访问性能
A,避免在索引列上使用 IS NULL 和 IS NOT NULL 操作 避免在索引中使用然后可以为空的列,ORACLE将无法使用该索引.对于单列索引 如果包含空值,索引将不存在此记录.对于复合索引 ...
- CSS3背景色透明(兼容IE8)
标准浏览器通过rgba()实现背景色透明;IE8以下浏览器通过特有滤镜实现背景色透明. 代码如下: 1 /* IE8 */ 2 filter:progid:DXImageTransform.Micro ...
- Python知识点小记
类 设置类属性必须使用类对象,若使用实例对象设置,会重新创建一个和类属性同名的实例属性 类对象可调用 类方法&静态方法, 实例对象可调用 实例方法&类方法&静态方法; 类方法和 ...
- Windows下 webpack4.0 的安装
这里我们通过npm来进行安装 1. 安装 webpack // 全局安装webpack npm install webpack -g 2. 通过 webpack -v 命令查看当前安装的版本 此时如果 ...
- MQTT详解以及在IoT中的应用
MQTT定义: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台, ...
- Android 动态渐变按钮
先上个图 看着特别炫酷吧 其实就是自定义颜色两秒轮播动画 AnimationDrawable animationDrawable = (AnimationDrawable) button.getBac ...
- SGCC_UAP启动停留在initializing java tooling(1%)
找到uap的安装目录,eclipse文件夹下的eclipse.ini,用EditPlus打开,添加下面两行 -vmC:\Program Files\Java\jdk1.6.0_43\bin\ 在-vm ...
- MySQL四种隔离级别和MVCC
事务在一个数据库中的地位尤为重要,尤其是高并发的场合.保证数据库操作的原子性和错误出现情况下的回滚,对数据的安全性和可靠性提供了保障.事务有四大原则,即ACID原则.网上关于这个问题的文章有很多,读者 ...