[抄题]:

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

对于4皇后问题存在两种解决的方案:

[

[".Q..", // Solution 1

"...Q",

"Q...",

"..Q."],

["..Q.", // Solution 2

"Q...",

"...Q",

".Q.."]

]

[思维问题]:

看不懂特殊情况:主要是要区别x y

[一句话思路]:

DFS去掉特殊情况后画图

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. search函数可以是空类型,不返回search函数,返回其中的results即可。cols链表是后续函数的参数,此处需要新建链表。
  2. 如果辅助链表cols满了,需要在结果数组中添加画图,之后直接返回results。cols是数组,画成图才是链表
  3. drawCheesboard方法中,需要新建一个chessboard数组,作为最后返回的结果。 sb.append(j == cols.get(i) ? 'Q' : '.');表示j如果到达x有值处就打印Q
  4. 判断函数要有默认的return true 此函数判断的是cols,column是否有效,因此全部行通过后返回true

[二刷]:

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

search函数用的DFS回溯是关键

[复杂度]:Time complexity: O(分支的深度次方) Space complexity: O(分支*深度)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

DFS:找出全部方法

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

Nqueen第二版,改参数不行 暂时算了吧

[代码风格] :

  1. 规律:返回值和函数类型是相同的
class Solution {
/**
* Get all distinct N-Queen solutions
* @param n: The number of queens
* @return: All distinct solutions
* For example, A string '...Q' shows a queen on forth position
*/
List<List<String>> solveNQueens(int n) {
List<List<String>> results = new ArrayList<>();
if (n <= 0) {
return results;
} search(results, new ArrayList<Integer>(), n);
return results;
} /*
* results store all of the chessboards
* cols store the column indices for each row
*/
private void search(List<List<String>> results,
List<Integer> cols,
int n) {
if (cols.size() == n) {
results.add(drawChessboard(cols));
return;
} for (int colIndex = 0; colIndex < n; colIndex++) {
if (!isValid(cols, colIndex)) {
continue;
}
cols.add(colIndex);
search(results, cols, n);
cols.remove(cols.size() - 1);
}
} private List<String> drawChessboard(List<Integer> cols) {
List<String> chessboard = new ArrayList<>();
for (int i = 0; i < cols.size(); i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < cols.size(); j++) {
sb.append(j == cols.get(i) ? 'Q' : '.');
}
chessboard.add(sb.toString());
}
return chessboard;
} private boolean isValid(List<Integer> cols, int column) {
int row = cols.size();
for (int rowIndex = 0; rowIndex < cols.size(); rowIndex++) {
if (cols.get(rowIndex) == column) {
return false;
}
if (rowIndex + cols.get(rowIndex) == row + column) {
return false;
}
if (rowIndex - cols.get(rowIndex) == row - column) {
return false;
}
}
return true;
}
}

最新文章

  1. Redis_redis分布式锁-SETNX
  2. MySQL的loose index scan
  3. jquery的offset().top 和position().top 详解 和如何用js实现
  4. Java_通过反射调用类中的方法
  5. LeetCode Paint House II
  6. WeUI 为微信 Web 服务量身设计-h5前端框架
  7. 几款python集成开发环境
  8. SqlServer 在创建数据库时候指定的初始数据库大小是不能被收缩的
  9. LinkedHashSet与TreeSet
  10. CRM IFRAME 显示地图
  11. eclipse下使用Genymotion调试Android程序出现的问题
  12. java并发5-volatile关键字解析
  13. Lonely Integer
  14. c#将输入的人民币数字金额转换成小写
  15. 统计学习方法:罗杰斯特回归及Tensorflow入门
  16. rm 命令详解
  17. 基于kettle的简单HTTP接口监控
  18. 【SDOI2017】天才黑客
  19. day6大纲
  20. .net通过url访问服务器获取服务器返回数据

热门文章

  1. 利用百度翻译API,获取翻译结果
  2. 当vcenter是linux版本的时候Sysprep存放路径
  3. CA证书认证单向和双向的区别
  4. numpy的linspace函数
  5. 运行quectel EC20 module example data
  6. redis 导出
  7. python读取文件中的字典
  8. Neuromation新研究:利用卷积神经网络进行儿童骨龄评估
  9. 开发组件:Supervisor
  10. Map 合并