题目描述:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ]
解法1。DFS回溯。其实这里比N皇后I简化了,不需要保存有效的结果,只需在递归到底时让一个全局变量+1,因为能递归到底的都是每一步(每个位置)有效的(同列、对角线1、对角线2都无皇后)
class Solution(object):
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
if n<= 0:
return 0
self.res = 0
cols = [0 for _ in range(n)]
dial1 = [0 for _ in range(2*n-1)]
dial2 = [0 for _ in range(2*n-1)]
self.helper(n, cols, dial1, dial2, 0)
return self.res
def helper(self, n, cols, dial1, dial2, index):
if index == n:
self.res += 1
return
else:
for i in range(n):
if cols[i] == 0 and dial1[index+i] == 0 and dial2[index-i+n-1] == 0:
cols[i] = 1
dial1[index+i] = 1
dial2[index-i+n-1] = 1
self.helper(n, cols, dial1, dial2, index+1)
cols[i] = 0
dial1[index+i] = 0
dial2[index-i+n-1] = 0
return