对于非递归解决 n 皇后问题,可以使用回溯算法来实现。以下是一个可能的实现:
def is_safe(board, row, col):
# 检查当前位置是否安全(不与已放置的皇后冲突)
for i in range(row):
if board[i] == col or board[i] - i == col - row or board[i] + i == col + row:
return False
return True
def solve_n_queens(n):
solutions = [] # 存储所有解决方案
stack = [] # 使用栈来保存回溯过程中的状态
# 初始化第一行皇后位置为(0,0),将其入栈
stack.append((0, 0))
while stack:
row, col = stack.pop() # 弹出栈顶元素
while col < n:
if is_safe([r for r, c in stack], row, col): # 检查当前位置是否安全
stack.append((row, col)) # 将当前位置入栈
if row == n-1: # 如果已经放置了最后一行的皇后,表示找到一个解决方案
solutions.append([c for r, c in stack])
break
row += 1 # 进入下一行,从第0列开始搜索
col = 0
else:
col += 1 # 如果当前位置不安全,尝试下一个位置
if not stack:
break
last_row, last_col = stack.pop() # 回溯到上一行
col = last_col + 1 # 继续从上一行的下一列开始搜索
return solutions
# 测试代码
n = int(input())
solutions = solve_n_queens(n)
print(f"{n}皇后问题共有{len(solutions)}种摆放方案")
for solution in solutions:
board = [["*"] * n for _ in range(n)]
for i, j in enumerate(solution):
board[i][j] = "Q"
for row in board:
print(" ".join(row))
请将以上代码复制到编辑器的 Begin-End 部分,并输入要测试的皇后数目,运行代码即可得到相应的解决方案。
内容由零声教学AI助手提供,问题来源于学员提问




