您的位置:首页 > 其它

leetcode_51. N 皇后

2020-09-03 10:53 579 查看

目录

一、题目内容

二、解题思路

三、代码

一、题目内容

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

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

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

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

示例:

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

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

提示:

皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

二、解题思路

DFS+回溯,逐行检查皇后位置(横行、纵行或斜线)

三、代码

[code]class Solution:
def solveNQueens(self, n: int):
res = []
path = [['.' for _ in range(n)] for _ in range(n)]

def print_path():
for i in range(n):
print(path)
print('\n')

def change_style(path):
new_path = []
for i in range(n):
cow_path = ''
for j in range(n):
cow_path += path[i][j]
new_path.append(cow_path)
return new_path

def isValid(r, c):
for i in range(1, r + 1):
if path[r - i][c] == 'Q':
return False
if c - i >= 0 and path[r - i][c - i] == 'Q':
return False
if c + i < n and path[r - i][c + i] == 'Q':
return False
return True

def dfs(pos: int):

if pos == n:
change_style_path = change_style(path)
res.append(change_style_path)
return
for i in range(n):
if isValid(pos, i):
path[pos][i] = 'Q'
# print_path()
dfs(pos + 1)
path[pos][i] = '.'
# print_path()
dfs(0)
return res

if __name__ == '__main__':
n = 4
ans_org = [['.', 'Q', '.', '.'],
['.', '.', '.', 'Q'],
['Q', '.', '.', '.'],
['.', '.', 'Q', '.']]
s = Solution()
ans = s.solveNQueens(n)
print(ans)
悲恋花丶无心之人 CSDN认证博客专家 [i] TensorFlow 深度学习 神经网络 计算机视觉在读研究生,熟悉Pytorch,MXNet,TensorFlow,Keras等深度学习框架,主要涉及的领域有目标检测,语义分割,超分辨率重建,行人重识别等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: