我正在看chapter 14.8. "Eight Queens puzzle" of "Learning with Python 3 (RLE)"
它讨论了8皇后问题的解决方案。例如,此解决方案:
由8个值组成的列表表示,其中每个值逐列给出皇后的行索引:
[6, 4, 2, 0, 5, 7, 1, 3]
现在我正在尝试解决练习4c:
Write a function to rotate a solution by 90 degrees anti-clockwise
我的代码:
def ninety_degrees(n):
result = []
for i in range(len(n)):
result.append("")
for i in n:
result[i] += str(n.index(i))
return result
print(ninety_degrees([1,1,1,1,1,1,1,1]))
它回来了
['', '00000000', '', '', '', '', '', '']
而不是
['', '01234567', '', '', '', '', '', '']
事实上,我认为完美的答案是
['', [0,1,2,3,4,5,6,7], '', '', '', '', '', '']
…但当我尝试使用整数而不是字符串时,会不断出现错误
让我们以需要旋转的示例解决方案为例:
如问题所述,这代表了这一立场:
< >逆时针旋转它,考虑结果列表中的第一个值:它将涉及当前行0中的皇后。因此,您必须在当前列表中找到0所在的列。该列索引和板右端之间的距离将成为结果中第一个皇后的行号
将此应用于所有其他皇后,您将得到以下算法:
对于上述示例,结果将是:
基本上,您有一个包含8个元素的列表,它们代表皇后的位置: 假设列表名为
queens
,queens[i] = j
(其中i
和j
都是整数)意味着在(i,j)
有一个皇后要了解如何执行90度旋转,您需要了解位于
(i,j)
的皇后的位置。在阅读以下破坏解决方案的内容之前,请尝试使用该提示解决问题,或者至少尝试回答以下问题:“如果女王有坐标(i, j)
,那么她在旋转后的坐标是什么?”解决方案: 如果您有一个大小为8x8的棋盘,那么旋转的形式是
(i, j) -> (j, 7-i)
(它是7-i
而不是8-i
,因为我们从0开始计数,在7结束)。如果你不相信(如果这是你第一次看到这个,你就不应该相信),我让你用一个真正的棋盘或其他东西来验证它是一个正确的公式。如果你想知道如何找到这样一个公式,我认为你应该首先学习线性代数,特别是平面旋转矩阵的表示。如果你认为它太复杂(即使,真的,它不是那么难,并且你应该在可能的时候试着学习),就忽略它,它现在不会有用现在,我再次鼓励您,尝试自己编写解决方案,,现在您已经有了公式。如果你不能想出一个解决方案,我会把它添加到这篇文章中
相关问题 更多 >
编程相关推荐