【问题标题】:Parker Square optimization派克广场优化
【发布时间】:2016-04-18 19:54:55
【问题描述】:

这里的帕克正方形是指包含整数的 9x9 网格。将所有整数平方后,每行、每列和每条对角线的总和是相同的。 (网格中的所有单元格不能包含相同的数字)。

https://www.youtube.com/watch?v=aOT_bG-vWyg 关于该主题的 5 分钟视频

我正在尝试解决这个问题,但我需要一些帮助来优化我当前的解决方案,这非常业余。

首先,我将 9x9 网格中的所有单元格命名为变量 a-i 然后,我分别计算每列、行和对角线的平方和,并检查它们是否都相等一次。

我的代码在下面的 Python 中,有什么建议吗?

for a in range(1,10):
    for b in range(1,10):
        for c in range(1,10):
            for d in range(1,10):
                for e in range(1,10):
                    for f in range(1,10):
                        for g in range(1,10):
                            for h in range(1,10):
                                for i in range(1,10):
                                     j=a**2+b**2+c**2
                                     k=d**2+e**2+f**2
                                     l=g**2+h**2+i**2
                                     m=a**2+d**2+g**2
                                     n=b**2+e**2+h**2
                                     o=c**2+f**2+i**2
                                     p=a**2+e**2+i**2
                                     q=c**2+e**2+g**2
                                     if j==k and k==l and l==m and m==n and n==o and o==p and p==q:
                                         print(a)
                                         print(b)
                                         print(c)
                                         print(d)
                                         print(e)
                                         print(f)
                                         print(g)
                                         print(h)
                                         print(i)
                                     break

【问题讨论】:

  • 它被称为魔方。帕克广场只是视频中的特定广场。
  • 您可以使用cartesian product 代替那些嵌套循环,例如product(range(1, 10), repeat=9)
  • 这是我写的Java magic square tester 答案。初始列表需要更改为所有数字的平方。
  • @PeterWood 不能有重复的数字,所以应该是一个排列。

标签: python


【解决方案1】:

您的代码有效吗? (这可能是您的首要任务。)

一些建议...

1) 你认为这可能类似于幻方吗?有一些方法可以构建它们,例如https://plus.maths.org/content/anything-square-magic-squares-sudoku,这可能会有所帮助。

2) 由于您不能两次包含相同的数字,如果两个数字相同,也许您可​​以退出循环。这是比平方和求和更快的运算。

3) 你可以考虑减少力量。如果两行数字加起来一样,那么它们的平方和也一样吗?

4) 您可以置换向量 [1,2,3,4,5,6,7,8,9],而不是通过所有 999,999,999 个组合进行暴力破解?这是关于 python 排列的一个很好的 SO 问题:How to generate all permutations of a list in Python

【讨论】:

    【解决方案2】:

    根据 rajah9 的回答,确认您的代码是否有效确实应该是首要任务。从外观上看,您的代码将无法工作,因为它从不检查关键条件:

    “网格中的所有单元格不能包含相同的数字。”
    为了纠正这个问题,行

    if j==k and k==l and l==m and m==n and n==o and o==p and p==q:
    



    应该扩展到

    if j==k and k==l and l==m and m==n and n==o and o==p and p==q: and a!=b and a!=c and a!=d
    # and so on until all the 9 cells have been catered for
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2013-05-20
      • 2023-04-02
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多