在 N-皇后问题中,需要遍历一个二维数组来确定放置皇后的位置。可以通过两种方式进行遍历:按行遍历和按列遍历。
按行遍历
按行遍历二维数组意味着依次遍历每一行,并在每一行中尝试放置皇后。如果可以放置Queen,则递归到下一行,否则向上回溯并尝试下一个位置。
下面是一个按行遍历二维数组的示例代码:
def backtrack(row, queens, n, board, ans):
if row == n:
ans.append(queens)
return
for col in range(n):
if is_valid(row, col, board):
board[row][col] = 'Q'
backtrack(row+1, queens+[col], n, board, ans)
board[row][col] = '.'
def is_valid(row, col, board):
n = len(board)
# check column
for i in range(row):
if board[i][col] == 'Q':
return False
# check diagonal
for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
if board[i][j] == 'Q':
return False
for i, j in zip(range(row-1, -1, -1), range(col+1, n)):
if board[i][j] == 'Q':
return False
return True
def solve_n_queens(n: int) -> List[List[str]]:
board = [['.'] * n for _ in range(n)]
ans = []
backtrack(0, [], n, board, ans)
return ans
按列遍历
按列遍历二维数组意味着依次遍历每一列,并在每一列中尝试放置皇后。如果可以放置Queen,则递归到下一列,否则向上回溯并尝试下一个位置。
下面是一个按列遍历二维数组的示例代码:
def solve_n_queens(n: int) -> List[List[str]]:
board = [['.'] * n for _ in range(n)]
cols, diag, anti_diag = set(), set(), set()
ans = []
backtrack(0, n, board, ans, cols, diag, anti_diag)
return ans
def backtrack(row, n, board, ans,