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 ...
随机推荐
- AnyVal与AnyRef
AnyRef 是所有引用类型的基类.除了值类型,所有类型都继承自AnyRef . AnyVal AnyVal 所有值类型的基类, 它描述的是值,而不是代表一个对象. 它包括 9 个 AnyVal ...
- laravel使用JSON 类型方式进行存储
Laravel 从 5.0 版本开始就已支持 JSON 数据的转换,但这样做的目的只是为了方便数据处理.你的数据依然以 TEXT 类型存放在你的数据库里.不过 MySQL 从 5.7 版本起开始支持原 ...
- 【Java基础】10、Java中throw和throws的区别
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- webpack4 系列教程(四): 单页面解决方案--代码分割和懒加载
本节课讲解webpack4打包单页应用过程中的代码分割和代码懒加载.不同于多页面应用的提取公共代码,单页面的代码分割和懒加载不是通过webpack配置来实现的,而是通过webpack的写法和内置函数实 ...
- JS之this应用详解
目录 1. this作为全局变量2. 作为对象方法的调用3. 作为构造函数调用4. apply调用 this是Javascript语言的一个关键字.它代表函数运行时,自动生成的一个内部对象,只能在函数 ...
- 洛谷P2572 [SCOI2010]序列操作(ODT)
题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long l ...
- 【代码笔记】Web-ionic tab(选项卡)
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 转载---解决 eclipse 中发布的java-web工程,jar包无法发布到tomcat 的lib下。
1.首先: Server Locations修改后会变灰,如果需要更改设置,则需要移除与Tomcat服务器关联的项目,同时,鼠标右键菜单Clean清除Tomcat服务器的状态^^就可以修改了. 此时E ...
- Apex计划作业框架的实现
Apex计划作业框架的实现 在本文中,我们实现一个简单的"计划作业框架",用于实现数据的定时自动处理. Apex相关接口 Apex中提供了一组接口用来实现数据的处理.我们主要使用以 ...
- Android之移动热修复
阿里云推出了移动热修复服务,听说这个服务傻瓜式接入,性能相对较好,对新技术比较好奇的我决定尝试一下. 1.首先,需要开通这个服务,创建应用 2.然后,在项目中接入服务.按照文档所述 第一步:gradl ...