51. N 皇后(返回棋盘)
https://leetcode-cn.com/problems/n-queens/
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
- 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
https://leetcode-cn.com/problems/n-queens/solution/10xing-python-by-powcai/
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
res = []
s = "." * n
# 记录 行, 列, 正对角,负对角,不能有两个以上的棋子
# 正对角就是相加之和一样的
# 负对角就是相减只差一样的
def back_track(i, tmp, col, z_diagonal, f_diagonal):
if i == n:
res.append(tmp)
return
for j in range(n):
if j not in col and i + j not in z_diagonal and i - j not in f_diagonal:
print(z_diagonal)
# col | {j} 求并集
back_track(i + 1,
tmp + [s[:j] + "Q" + s[j + 1:]],
col | {j},
z_diagonal | {i + j},
f_diagonal | {i - j})
back_track(0, [], set(), set(), set())
return res
s = Solution()
print(s.solveNQueens(4))
52. N皇后 II(返回可行数)
https://leetcode-cn.com/problems/n-queens-ii/
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
class Solution(object):
def totalNQueens(self, n):
"""
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
"""
# 记录 行, 列, 正对角,负对角,不能有两个以上的棋子
# 正对角就是相加之和一样的
# 负对角就是相减只差一样的
self.res = 0
def back_track(i, col, z_diagonal, f_diagonal):
if i == n:
return True
# col | {j} 求并集
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 back_track(i+1,
col | {j},
z_diagonal | {i + j},
f_diagonal | {i - j}):
self.res += 1
return False
back_track(0, set(), set(), set())
return self.res