python - 我对这个 python 编程练习感到非常困惑,谁能告诉我有什么问题吗?
问题描述
我目前正在做一个python
练习,当给定一个大小为 的棋盘时n
,它是返回一个具有最大皇后数的解决方案,以便没有两个皇后相互攻击。因此,一个解决方案要求没有两个皇后共享相同的行、列或对角线。
我目前能够生成板,但问题出现在我的代码的第 20 行,其中if bd not in soln
. 由于某种我无法识别的原因,该代码行无法正确执行,并且正确地将正确的板附加到我的解决方案集中。
如果有人可以帮助确定问题,我将不胜感激。
import random
def queensol(n):
"""Find the number of solutions to placing Queens on a chessboard of size n"""
size = n
rng = random.Random()
tries = 0
bd = list(range(size))
soln = []
while True:
tries += 1
rng.shuffle(bd)
correct = 0
for queen_index in range(size):
if queen_noclash(bd, queen_index):
correct += 1
board_valid = correct == size
if board_valid:
if bd not in soln:
soln.append(bd)
print(soln)
def no_diagonal(x1, y1, x2, y2):
dx = abs(x1-x2)
dy = abs(y1-y2)
# print('dx',dx)
# print('dy',dy)
if dx == dy:
return False
else:
return True
def queen_noclash(bd, queen):
correct = 0
for left_queen in range(queen):
left_queen_x = left_queen
left_queen_y = bd[left_queen]
queen_x = queen
queen_y = bd[queen]
if no_diagonal(left_queen_x, left_queen_y, queen_x, queen_y):
correct += 1
if correct == queen:
return True
else:
return False
queensol(4)
解决方案
问题是 bd 是一个对象。您正在将相同的对象附加到板上。因此,即使 bd 更改bd not in soln
总是会给出 False ,因为您正在比较同一个对象。每次附加到 soln 数组时,都应该使用 list(bd) 创建一个新对象。我已经在下面的代码中解决了这个问题。
import random
def queensol(n):
"""Find the number of solutions to placing Queens on a chessboard of size n"""
size = n
rng = random.Random()
tries = 0
bd = list(range(size))
soln = []
while True:
tries += 1
rng.shuffle(bd)
correct = 0
for queen_index in range(size):
if queen_noclash(bd, queen_index):
correct += 1
board_valid = correct == size
if board_valid:
if bd not in soln:
soln.append(list(bd))
print(soln)
def no_diagonal(x1, y1, x2, y2):
dx = abs(x1-x2)
dy = abs(y1-y2)
# print('dx',dx)
# print('dy',dy)
if dx == dy:
return False
else:
return True
def queen_noclash(bd, queen):
correct = 0
for left_queen in range(queen):
left_queen_x = left_queen
left_queen_y = bd[left_queen]
queen_x = queen
queen_y = bd[queen]
if no_diagonal(left_queen_x, left_queen_y, queen_x, queen_y):
correct += 1
if correct == queen:
return True
else:
return False
queensol(4)
推荐阅读
- dynamics-ax-2012-r3 - 学习批处理作业参数 AX 2012
- c# - 发布 WebAPI 项目
- mysql - 查找最大名称
- r - 从数据框中获取功能
- ios - 将 animatingDifferences 设置为 true 时,使用 UITableViewDiffableDataSource 将单元格移动到新部分会使应用程序崩溃
- spring-security - 如何绕过spring webflux security中的一些url?
- javascript - Uncaught Invariant Violation:函数组件不能有引用。你的意思是使用 React.forwardRef() 吗?
- angular - 在 component.html (Angular) 中构建一个字符串
- reactjs - 错误:操作必须是普通对象。使用自定义中间件进行异步操作。如何解决?
- symfony - EasyAdmin 3 中一个 CrudController 中 2 个实体的字段