题目:52. N皇后 II
链接:https://leetcode-cn.com/problems/n-queens-ii/description/
求出N皇后的解的数量。
似乎这个解的个数并没有什么计算公式,所以就把上一个题目改了一下。用的是dfs,记得以前看过一个高效的解法,但是给忘了。。。
python:
class Solution(object):
ret = 0
def totalNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
#棋盘的合法位置
def isPosLegal(x,y,n):
return x>=0 and x<n and y>=0 and y<n
#x行y列能否放置Q
def isLegal(x,y,n,field):
if "Q" in field[x]:
return False
for r in range(n):
if field[r][y]=="Q":
return False
xtmp,ytmp=x,y
while isPosLegal(xtmp,ytmp,n):
if field[xtmp][ytmp]=="Q":
return False
xtmp-=1
ytmp-=1
xtmp, ytmp = x, y
while isPosLegal(xtmp,ytmp,n):
if field[xtmp][ytmp]=="Q":
return False
xtmp-=1
ytmp+=1
xtmp, ytmp = x, y
while isPosLegal(xtmp,ytmp,n):
if field[xtmp][ytmp]=="Q":
return False
xtmp+=1
ytmp-=1
xtmp, ytmp = x, y
while isPosLegal(xtmp,ytmp,n):
if field[xtmp][ytmp]=="Q":
return False
xtmp+=1
ytmp+=1
return True
field=[["." for i in range(n)] for j in range(n)]
def getMap(n,field):
ret=[]
for i in range(n):
ret.append("".join(field[i]))
return ret
def dfs(row,n,field):
if row==n:
self.ret+=1
return
for col in range(n):
if isLegal(row,col,n,field):
field[row][col]="Q"
dfs(row+1,n,field)
field[row][col] = "."
dfs(0,n,field)
return self.ret