leetcode # 51 N皇后问题
本质上是一个全排列问题
class Solution(object):
def solveNQueens(self, n):
if n <= 0:
return ''
# 肯定是一行一个皇后,一列也是一个皇后
# 所以可以定义一个一维数组,索引是行号,值是列号。比如nums[0] = 1 表示第一个皇后在第行第列
nums = [-1] * n
res = []
self.Permutation(nums, 0, res, [])
return res
def Permutation(self, nums, index, res, path):
# 进行N皇后的全排列
if index == len(nums):
res.append(path)
return
else:
for i in range(len(nums)):
nums[index] = i
if self.isValid(nums, index):
# 第i个皇后的位置有效,进行下一个皇后的排位置
tmp = '.' * len(nums)
self.Permutation(nums, index+1, res, path + [tmp[:i]+'Q'+tmp[i+1:]])
def isValid(self, nums, n):
# 判断皇后位置是否有效。
# 因为一维数组已经保证N皇后们不会同行同列,所以只需要保证不再同一对角线就行了
# 对角线也就是一条有截距的直线,y= x+b, 也就是y-x = b(是定值)
# 只要保证 y1-y2 != x1-x2 就是有效的
for i in range(n):
if abs(nums[i] - nums[n]) == n-i or nums[i] == nums[n]:
return False
return True
Solution().solveNQueens(4)