LeetCode每日一题—N皇后
问题:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
问题分析
对于N皇后问题来讲,比较好理解的就是回溯算法,回溯算法就是一种试的办法,利用条件剪枝从而减少复杂程度。既然要一步一步的试,那我们就要找一个方法进行搜索,这样才能进行取出来试,我们采用DFS的搜索方法,DFS搜索是递归方法,这在平常算法题中经常遇到
问题解决
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
def valid(nums,row): #判断是否满足条件
for i in range(row):
if abs(nums[i]-nums[row])==abs(row-i) or nums[i]==nums[row]: #对于在同一对角线,行与行差值的绝对值与列于列差值的绝对值相等
return False
return True
def dfs(nums,row): #回溯法 深度优先探索解空间
if row==n: #当我们把八个行都放好,说明这个可以实现
ans.append(nums[:])
return
for i in range(n):
nums[row]=i #row代表所在的行,nums[row]代表所在的列
if valid(nums,row):
dfs(nums,row+1)
ans=[]
a=[0 for _ in range(n)]
dfs(a,0)
return len(ans)