给定一个整数 n,返回 n 皇后不同的解决方案的数量。放置一个皇后后,其所在行,所在列,所在对角线不能再放置另外一个皇后。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
输出答案个数:
class Solution:
def totalNQueens(self, n: int) -> int:
def backwards(row = 0,count = 0):
for col in range(n):
if could_place(row,col):
place(row,col)
if row==n-1:
count+=1
else:
count+=backwards(row+1)
remove(row,col)
return count
def could_place(row,col):
return not (cols[col] or hill[row+col] or dale[row-col])
def place(row,col):
cols[col] = 1
hill[row+col] = 1
dale[row-col] = 1
def remove(row,col):
cols[col] = 0
hill[row+col] = 0
dale[row-col] = 0
cols = [0]*n
hill = [0]*(2*n-1)
dale = [0]*(2*n-1)
count = backwards()
return count
执行用时 :76 ms, 在所有 Python3 提交中击败了63.64%的用户
内存消耗 :13.1 MB, 在所有 Python3 提交中击败了88.96%的用户
输出答案版:
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
def backwards(row = 0):
for col in range(n):
if could_place(row,col):
place(row,col)
if row==n-1:
sol.append(output())
else:
backwards(row+1)
remove(row,col)
def output():
b = []
for i in range(n):
a = []
for j in range(n):
a.append(".")
b.append(a)
for i in range(len(ansi)):
# for j in range(len(ansj)):
b[ansi[i]][ansj[i]] = "Q"
b[i] = ''.join(b[i])
return b
def could_place(row,col):
return not (cols[col] or hill[row+col] or dale[row-col])
def place(row,col):
ansi.append(row)
ansj.append(col)
cols[col] = 1
hill[row+col] = 1
dale[row-col] = 1
def remove(row,col):
ansi.pop()
ansj.pop()
cols[col] = 0
hill[row+col] = 0
dale[row-col] = 0
ansi = []
ansj = []
cols = [0]*n
hill = [0]*(2*n-1)
dale = [0]*(2*n-1)
sol = []
backwards()
return sol