题目链接 : https://leetcode-cn.com/problems/n-queens-ii/

题目描述:

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

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

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

示例:

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

思路:

回溯算法

记录 行, 列, 正对角,负对角,不能有两个以上的棋子.

如何判断是否在对角上呢?

正对角就是相加之和一样的

负对角就是相减只差一样的


关注我的的知乎专栏,了解更多的解题技巧,共同进步!

代码:

class Solution:
def totalNQueens(self, n: int) -> int:
self.res = 0
def backtrack(i,col,z_diagonal,f_diagonal):
if i == n:return True
for j in range(n):
if j not in col and i + j not in z_diagonal and i - j not in f_diagonal:
if backtrack(i+1, col | {j}, z_diagonal |{i + j} , f_diagonal |{i - j} ) :
self.res += 1
return False
backtrack(0,set(),set(),set())
return self.res
class Solution {
int res = 0;
public int totalNQueens(int n) {
Set<Integer> col = new HashSet<>();
Set<Integer> z_diagonal = new HashSet<>();
Set<Integer> f_diagonal = new HashSet<>(); backtrack(0, n,col, z_diagonal, f_diagonal);
return res;
}
private boolean backtrack(int i, int n,Set<Integer> col, Set<Integer> z_diagonal, Set<Integer> f_diagonal) {
if (i == n) {
return true;
}
for (int j = 0; j < n; j++) {
if (!col.contains(j) && !z_diagonal.contains(i + j) && !f_diagonal.contains(i - j)) {
col.add(j);
z_diagonal.add(i + j);
f_diagonal.add(i - j);
if (backtrack(i+1,n,col,z_diagonal,f_diagonal)) res += 1;
col.remove(j);
z_diagonal.remove(i + j);
f_diagonal.remove(i - j);
}
}
return false;
}
}

最新文章

  1. BOM 浏览器对象模型
  2. js判断undefined类型
  3. js高级群的一些整理6月
  4. oracle之检查点(Checkpoint)
  5. [HTML5 Canvas学习] 基础知识
  6. C# 获取本机IP地址以及转换字符串
  7. ollicle.com: Biggerlink – jQuery plugin
  8. java面向对象下:Java数据库编程
  9. C语言_用if```else语句解决奖金发放问题
  10. vue生命周期的介绍
  11. ajax 做登录 实现页面免刷新
  12. Zkdash安装
  13. Struts框架之 执行流程 struts.xml 配置详细
  14. Hadoop完全分布式安装教程
  15. 关于ES6 的对象解构赋值
  16. 网络知识 - 简易的自定义Web服务器
  17. windows下更换pip源
  18. 前端UI框架总结
  19. Php文件上传类class.upload.php
  20. 7.5 zookeeper客户端curator的基本使用 + zkui

热门文章

  1. 上采样 及 Sub-pixel Convolution (子像素卷积)
  2. Vue结合后台的增删改案例
  3. 创建一个简单的 Springboot web项目
  4. Python 爬虫十六式 - 第七式:正则的艺术
  5. const与#define的区别
  6. gdal test
  7. Linux shell - 除法保留小数点
  8. 异步实时搜索jquery select插件
  9. 分享页(把末尾的JS函数换成这个)
  10. Centos7系统备份与恢复教程