经典的 N-Queens 问题找到了一种将 n 个皇后放置在 n×n 棋盘上的方法,这样两个皇后就不会相互攻击。这是我对 N-Queens 问题的解决方案。
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
grid = [['.' for _ in range(n)] for _ in range(n)]
solved = self.helper(n, 0, grid)
if solved:
return ["".join(item) for item in grid]
else:
return None
def helper(self, n, row, grid):
if n == row:
return True
for col in range(n):
if self.is_safe(row, col, grid):
grid[row][col] = 'Q'
if self.helper(n, row + 1, grid):
return True
else:
grid[row][col] = '.'
return False
def is_safe(self, row, col, board):
for i in range(len(board)):
if board[row][i] == 'Q' or board[i][col] == 'Q':
return False
i = 0
while row - i >= 0 and col - i >= 0:
if board[row - i][col - i] == 'Q':
return False
i += 1
i = 0
while row + i < len(board) and col + i < len(board):
if board[row + i][col - i] == 'Q':
return False
i += 1
i = 1
while row + i < len(board) and col - i >= 0:
if board[row + i][col - i] == 'Q':
return False
i += 1
i = 1
while row - i >= 0 and col + i < len(board):
if board[row - i][col + i] == 'Q':
return False
i += 1
return True
if __name__ == '__main__':
solution = Solution()
print(solution.solveNQueens(8))
这个问题的扩展状态,找到所有可能的解决方案并以列表的形式返回它们。我尝试通过将列变量添加到辅助方法来扩展我的解决方案,该方法从 0 开始以跟踪一个完整的解决方案和下一个解决方案的开始。因此基本情况变为
if row == n and col == n:
return True
但是这种方法不起作用,因为每个连续的递归调用都会在错误的列中结束。有人可以帮助扩展此解决方案以找到所有可能的解决方案。