51. N-Queens
题目描述:输入n, 在n行n列的数组中,每一行放置一个Queue,所有queue不能再同一列,不能在同一个斜对角
解释:(1)需要判断放置到该位置的queue是否合法,即不能在同一列,斜对角,这里用一个数组a记录每一行放置queue的位置,a[i]表示i行放置queue的位置,则当前放置的queue不能与数组a里面的值相同,处理斜对角,在斜对角的位置行列互减的绝对值相等, 即abs(a[i] - a[k]) == abs(i - k),满足这两个条件任何一个return False
(2)处理回溯,跳出条件即为当 当前行数k == n时
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
a = [None for _ in range(n)]
result = []
self.backstacking(a, n, 0, result)
return result
def backstacking(self, a, n, k, result):
if k == n:
result.append(self.printQueue(a, n))
return
for i in range(n):
a[k] = i
if self.isValid(a, k):
self.backstacking(a, n, k+1, result)
else:
continue
# 用一个一维数组来存储皇后,a[i] 表示i行皇后的位置,判断a[i]是否与当前j列冲突即可
# 斜线冲突,通过观察可以发现所有在斜线上冲突的皇后的位置都有规律即它们所在的行列互减的绝对值相等abs(a[i] - c) == abs(i-r)
def isValid(self, a, k):
for i in range(k):
if a[i] == a[k] or abs(a[i] - a[k]) == abs(i - k):
return False
return True
def printQueue(self, a, n):
result = []
for x in range(n):
for row in range(x, x+1):
tmp = ""
for col in range(n):
if x == row and col == a[x]:
tmp += 'Q'
else:
tmp += '.'
result.append(tmp)
return result
52. N-Queens II
题目描述:类似上一题计算有几种放置的方法
解释:在满足条件,即k == n时, result += 1即可
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
a = [None for _ in range(n)]
self.result = 0
self.backstacking(a, n, 0, self.result)
return self.result
def backstacking(self, a, n, k, result):
if k == n:
self.result += 1
return
for i in range(n):
a[k] = i
if self.isValid(a, k):
self.backstacking(a, n, k+1, self.result)
else:
continue
# 用一个一维数组来存储皇后,a[i] 表示i行皇后的位置,判断a[i]是否与当前j列冲突即可
# 斜线冲突,通过观察可以发现所有在斜线上冲突的皇后的位置都有规律即它们所在的行列互减的绝对值相等abs(a[i] - c) == abs(i-r)
def isValid(self, a, k):
for i in range(k):
if a[i] == a[k] or abs(a[i] - a[k]) == abs(i - k):
return False
return True