问题定义:国际象棋中,皇后可以直线进攻也可以斜线进攻,问在NxN的国际象棋棋盘上摆N个皇后,问摆使得N个皇后之间无法相互进攻有多少种摆法?
通过回溯法解决。
def isValid(matrix,row,col):
n = len(matrix)
for i in range(row):
for j in range(n):
if matrix[i][j]=='Q' and (j==col or abs(row-i)==abs(col-j)):
return False
return True
class Solution:
def solveNQueens(self, n: int):
matrix = [['.' for _ in range(n)] for __ in range(n)]
matrixs = []
def dfs(x):
if x==n:
tmp = matrix.copy()
for i in range(n):
tmp[i] = ''.join(tmp[i])
matrixs.append(tmp)
return
for col in range(n):
if isValid(matrix,x,col):
matrix[x][col]='Q'
dfs(x+1)
matrix[x][col]='.'
dfs(0)
return matrixs
关键在于判断当前皇后的位置和已经安排的皇后的位置是否冲突,深度优先搜索 dfs(x)中x代表皇后所在的行,由于我们是一行一行依次摆放皇后的,所以不存在行冲突。只需要判断列冲突和斜线的冲突。
判断条件 matrix[i][j]==1 and ( j==col and abs(row-i)==abs(col-j))
解释一下斜线的判断: 前面放置的皇后的位置 i,j 与 此刻皇后的位置 row ,col 行的间距和列的间距正好相等,说明他们在一条斜线上。