2020-03-15 19:49:59

问题描述:

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

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

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],

["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

问题求解:

N皇后问题是非常经典的回溯法问题,其核心思路就是使用回溯法去遍历解空间,并利用条件进行剪枝操作。

这里,我采用的是按行去放置皇后,那么我们就不需要记录行的放置信息了,因为这样可以保证一行内只有一个棋子。

我们还需要col[]数组去记录列的放置信息,diag1[],diag2[]数组去保存对角线的位置信息。

这里有个地方比较麻烦的就是对角线怎么表示,事实上对于主对角线i - j是一个常数,对于次对角线i + j是个常数。

我们可以很直观的看到次对角线的和是个常数,因为i + 1的时候伴随着j - 1;

对于主对角线,我们可以这样来判断。

第一行次对角线坐标的变化:(0, 0) -> (0, 1) -> (0, 2)...

第一行主对角线坐标的变化:(0, n-1) -> (0, n-2) -> (0, n-3)...

不难发现,只需要使用n - 1 - j就可以将其转化为次对角线的坐标关系。

剩下来就是一行一行的的去放置皇后并检测是否合理了。

时间复杂度:O(n!)

    int[] col;
int[] diag1;
int[] diag2;
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
col = new int[n];
diag1 = new int[2 * n - 1];
diag2 = new int[2 * n - 1];
helper(new char[n][n], 0, n);
return res;
} private void helper(char[][] board, int layer, int n) {
if (layer >= n) {
List<String> curr = new ArrayList<>();
for (char[] chs : board) curr.add(new String(chs));
res.add(curr);
return;
}
Arrays.fill(board[layer], '.');
for (int j = 0; j < n; j++) {
if (col[j] == 1 || diag1[layer + j] == 1 || diag2[layer - j + n - 1] == 1) continue;
col[j] = 1;
diag1[layer + j] = 1;
diag2[layer - j + n - 1] = 1;
board[layer][j] = 'Q';
helper(board, layer + 1, n);
board[layer][j] = '.';
diag2[layer - j + n - 1] = 0;
diag1[layer + j] = 0;
col[j] = 0;
}
}

  

最新文章

  1. JavaScript 中对变量和函数声明的“提前”
  2. SQL*Plus环境变量设置浅析
  3. MongoDB学习笔记一
  4. load mainaccount
  5. vim支持lua
  6. Apache中RewriteCond规则参数介绍
  7. 通过正则获取url参数
  8. RedHat7搭建MongoDB集群
  9. poj 1161 最短路构图
  10. VMware虚拟机相关文件问题
  11. ContentMode 几个属性
  12. iOS开发之指纹解锁
  13. Android测试点
  14. DirectX11--HR宏关于dxerr库的替代方案
  15. 启用Win10家庭版的远程桌面服务端
  16. 洛谷:P3281 [SCOI2013]数数 (优秀的解法)
  17. 构建高性能的MYSQL数据库系统-主从复制
  18. 命令查看WebSphere MQ运行状态
  19. Android:contentDescription 不是无用
  20. 如何查看K8S的网络是否完好

热门文章

  1. 机器学习算法的基本知识(使用Python和R代码)
  2. golang实现chunk方式的查询
  3. iPhone8、Note8、Mate10硬上面部识别:是潮流还是无奈
  4. Leetcode 20题 有效的括号(Valid Parentheses) Java语言求解
  5. LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚
  6. 学了C++不知道怎么搞后台开发?先看看这份学习路线吧!
  7. iMX287A基于嵌入式Qt的新冠肺炎疫情监控平台
  8. Arthas 实战,助你解决同名类依赖冲突问题
  9. 新大陆NB-IoT模块烧写详细过程
  10. Flex布局做出自适应页面--语法和案例