N皇后问题在力扣有两道题,这是经典的回溯算法问题。
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
52:N皇后
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
算法:
class Solution:
def totalNQueens(self, n: int) -> int:
self.res=0
def helper(n,ls=[]):
if len(ls)==n:
self.res+=1
return
for i in range(n):
if ls:
for idx,j in enumerate(ls):
if i==j or abs(i-j)==len(ls)-idx:break
else:
helper(n,ls+[i])
else:
helper(n, ls + [i])
helper(n)
return self.res
执行用时 :88 ms, 在所有 Python3 提交中击败了44.17%的用户
内存消耗 :13.6 MB, 在所有 Python3 提交中击败了20.00%的用户
51:N皇后
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
算法:
直接在52的基础上做改进。
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
res=[]
def helper(n,ls=[]):
if len(ls)==n:
t=[]
for i in ls:
t.append('.'*(i-0)+'Q'+'.'*(n-1-i))
res.append(t)
return
for i in range(n):
if ls:
for idx,j in enumerate(ls):
if i==j or abs(i-j)==len(ls)-idx:break
else:
helper(n,ls+[i])
else:
helper(n, ls + [i])
helper(n)
return res