Leetcode 51. N 皇后
解题技巧:所有的Q不在同一列,也不在同一条主对角线,更不在同一条副对角线。
判断是否在主对角线:主对角线所有元素的位置(i,j)之差为定值,即:i-j=固定值
判断是否在副对角线:副对角线所有元素的位置(i,j)之和为定值,即:i+j=固定值
def solveNQueens(self, n: int) -> List[List[str]]:
def makeQ(x):
listq=["." for _ in range(n)]
listq[x]="Q"
return "".join(listq)
def dfs(result,depth,used,count,diagonal,subdiagonal):
if depth==n:
res.append(result[:])
return
for i in range(n):
if i not in used and i+depth not in subdiagonal and i-depth not in diagonal:
diagonal.append(i-depth)
subdiagonal.append(i+depth)
used.append(i)
result.append(makeQ(i))
dfs(result,depth+1,used,i,diagonal,subdiagonal)
used.pop()
result.pop()
diagonal.pop()
subdiagonal.pop()
result=[]
res=[]
used=[]
diagonal=[]
subdiagonal=[]
dfs(result,0,used,0,diagonal,subdiagonal)
return res
**
Leetcode 52. N 皇后 II
**
def solveNQueens(n):
def makeQ(x):
listq=["." for _ in range(n)]
listq[x]="Q"
return "".join(listq)
def dfs(result,depth,used,count,diagonal,subdiagonal):
nonlocal ammount
if depth==n:
ammount+=1
return
for i in range(n):
if i not in used and i+depth not in subdiagonal and i-depth not in diagonal:
diagonal.append(i-depth)
subdiagonal.append(i+depth)
used.append(i)
result.append(makeQ(i))
dfs(result,depth+1,used,i,diagonal,subdiagonal)
used.pop()
result.pop()
diagonal.pop()
subdiagonal.pop()
result=[]
ammount=0
used=[]
diagonal=[]
subdiagonal=[]
dfs(result,0,used,0,diagonal,subdiagonal)
return ammount