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;
}
};

最新文章

  1. AttributeTargets 枚举
  2. oracle nvl和nvl2的区别
  3. ADO.Net的小知识(连接数据库)
  4. Extend ComboGrid Editors for DataGrid Of JQuery EasyUI
  5. C#控件命名规范
  6. windows server 2003 系统重装蓝屏
  7. (转载)linux那点事儿(中)
  8. c++中&amp;amp;和&amp;amp;&amp;amp;有什么差别
  9. cassandra 数据到Java对象的映射绑定
  10. javascript中原型链与instanceof 原理
  11. php 把驼峰样式的字符串转换成下划线样式的字符串
  12. props default 数组/对象的默认值应当由一个工厂函数返回
  13. Windows 激活的简单办法(能上网)
  14. flask 初学1
  15. (Android第一行代码实验一)活动的最佳实践
  16. vins-mono代码分析
  17. WebView 加载网页返回后,jsp界面数据消失(一个斜杆引起来的风波)
  18. poj1142
  19. [转载]java中io流关闭的顺序
  20. MapReduce C++ Library

热门文章

  1. angularjs学习第四天笔记(第一篇:简单的表单验证)
  2. Socket 类
  3. TP5手动引入PHPEXCEL的方法
  4. 【代码笔记】Web-HTML-布局
  5. JQuery瀑布流特效(练习)
  6. 对比学IT---路由器和linux流量统计的差别
  7. Linux LB--负载均衡和高可靠
  8. 安卓开发_数据存储技术_sqlite
  9. ViewPager防止Fragment销毁以及取消Fragment的预加载
  10. python变量的命名空间