如何将8皇后难题的解决方案旋转90度?

2024-06-02 08:31:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在看chapter 14.8. "Eight Queens puzzle" of "Learning with Python 3 (RLE)"

它讨论了8皇后问题的解决方案。例如,此解决方案:

enter image description here

由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], '', '', '', '', '', '']

…但当我尝试使用整数而不是字符串时,会不断出现错误


Tags: ofinforwithresult解决方案learningchapter
2条回答

让我们以需要旋转的示例解决方案为例:

bd = [6, 4, 2, 0, 5, 7, 1, 3]

如问题所述,这代表了这一立场:

enter image description here

< >逆时针旋转它,考虑结果列表中的第一个值:它将涉及当前行0中的皇后。因此,您必须在当前列表中找到0所在的列。该列索引和板右端之间的距离将成为结果中第一个皇后的行号

将此应用于所有其他皇后,您将得到以下算法:

rot = []
for i in range(len(bd)):
    rot.append(len(bd) - 1 - bd.index(i))

对于上述示例,结果将是:

rot = [4, 1, 5, 0, 6, 3, 7, 2]

基本上,您有一个包含8个元素的列表,它们代表皇后的位置: 假设列表名为queensqueens[i] = j(其中ij都是整数)意味着在(i,j)有一个皇后

要了解如何执行90度旋转,您需要了解位于(i,j)的皇后的位置。在阅读以下破坏解决方案的内容之前,请尝试使用该提示解决问题,或者至少尝试回答以下问题:“如果女王有坐标(i, j),那么她在旋转后的坐标是什么?”


解决方案: 如果您有一个大小为8x8的棋盘,那么旋转的形式是(i, j) -> (j, 7-i)(它是7-i而不是8-i,因为我们从0开始计数,在7结束)。如果你不相信(如果这是你第一次看到这个,你就不应该相信),我让你用一个真正的棋盘或其他东西来验证它是一个正确的公式。如果你想知道如何找到这样一个公式,我认为你应该首先学习线性代数,特别是平面旋转矩阵的表示。如果你认为它太复杂(即使,真的,它不是那么难,并且你应该在可能的时候试着学习),就忽略它,它现在不会有用

现在,我再次鼓励您,尝试自己编写解决方案,,现在您已经有了公式。如果你不能想出一个解决方案,我会把它添加到这篇文章中

相关问题 更多 >