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)] 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)该代码用的算法是什么
时间: 2023-06-26 14:06:27 浏览: 118
Python RuntimeError: thread.__init__() not called解决方法
5星 · 资源好评率100%
这段代码使用了经典的 N 皇后问题的解法,采用了深度优先搜索算法。具体地,代码中定义了一个 `Node` 类来表示棋盘上的一种情况,每个 `Node` 实例都代表棋盘上的一行。在 `get_moves` 方法中,对于当前行的每一个可行位置,都创建一个新的 `Node` 实例来代表下一行的情况,并将其添加到 `moves` 列表中。然后在主函数 `solve_n_queens` 中,使用一个队列来记录当前的搜索路径,不断从队列中取出 `Node` 实例,直到找到一个满足条件的解或者队列为空。具体来说,在每次取出一个 `Node` 实例时,如果它所代表的行是最后一行,则说明找到了一个解,直接返回该实例所代表的棋盘状态;否则,调用 `get_moves` 方法得到下一行的所有可行位置,并将对应的 `Node` 实例添加到队列中。由于搜索过程中,每个 `Node` 实例都只会被访问一次,因此该算法的时间复杂度为 $O(n^n)$,空间复杂度为 $O(n^2)$。
阅读全文