class Node: def __init__(self, board=None, row=None, col=None): self.board = board self.row = row self.col = col self.moves = [] def get_moves(self): last_row = self.row for col in range(len(self.board)): if is_safe(self.board, last_row + 1, col): new_board = [row[:] for row in self.board] new_board[last_row + 1][col] = 1 self.moves.append(Node(new_board, last_row + 1, col)) def is_safe(board, row, col): for i in range(row): if board[i][col] == 1: return False for i, j in zip(range(row, -1, -1), range(col, -1, -1)): if board[i][j] == 1: return False for i, j in zip(range(row, -1, -1), range(col, len(board), -1)): if board[i][j] == 1: return False return True def solve_n_queens(n): root = Node([[0 for _ in range(n)]], -1, None) current_list = [root] while current_list: node = current_list.pop(0) if node.row == n - 1: return node.board node.get_moves() for move in node.moves: current_list.append(move) n = int(input("请输入皇后数量:")) solution = solve_n_queens(n) for row in solution: print(row)该代码输入n的个数大于1会报错为什么
时间: 2023-06-25 07:07:59 浏览: 122
在代码中,当 `Node` 的实例化中,`board` 默认为 `None`,如果 `n` 的值大于 1,那么 `root` 中的 `board` 这个参数就是 `[[0, 0, ..., 0]]`,其中有 `n` 个 0。然后在 get_moves 函数中,这个参数被传递给了 `new_board`,得到了一个长度为 `n`,只有一行的棋盘。但是在 `is_safe` 函数中,会对 `board` 进行遍历,要求 `board` 至少有两行。因此会报错。
解决这个问题可以在 `Node` 的实例化中将 `board` 的默认值改为 `[[0 for _ in range(n)] for _ in range(n)]`,这样就可以避免上述问题。
阅读全文