题目
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1 输出:[["Q"]]
提示:
1 <= n <= 9
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1 输出:[["Q"]]
提示:
1 <= n <= 9
代码
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
ans = []
board = ['.'*n]*n
def backtracking(row, board):
if row == n:
ans.append(board.copy())
return
for col in range(n):
if isValid(row, col, board):
board[row] = '.'*col + 'Q' + '.'*(n-col-1)
backtracking(row+1, board)
board[row] = '.'*n
def isValid(row, col, chessboard):
for i in range(row):
if chessboard[i][col] == 'Q':
return False
if row > 0:
if col > 0:
for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
if chessboard[i][j] == 'Q':
return False
if col < n:
for i, j in zip(range(row-1, -1, -1), range(col+1, n, 1)):
if chessboard[i][j] == 'Q':
return False
return True
backtracking(0, board)
return ans
总结
下例for循环是(i,j)以元组的形式同时改变,跟两个嵌套for循环是不一样的。
for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1))
定义一个长度为n的向量
oard = ['.'*n]*n
以row每行递归回溯,然后对棋盘的列,45度,135度进行判断来看是否可以放Q,主要对两个斜方向上的Q,进行判断,其中对起点和行列的计算很重要。
def isValid(row, col, chessboard):
for i in range(row):
if chessboard[i][col] == 'Q':
return False
if row > 0:
if col > 0:
for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
if chessboard[i][j] == 'Q':
return False
if col < n:
for i, j in zip(range(row-1, -1, -1), range(col+1, n, 1)):
if chessboard[i][j] == 'Q':
return False
return True