0

我在编写用于求解魔方的递归置换函数时遇到了一些麻烦。对于这个函数,我不允许使用二维数组,只能使用列表。以下是我目前拥有的:

def permute(size):
    magicSquare = []
    for value in permute(size**2):
        for pos in range(size**2 + 1):
            magicSquare.append(value)
    return magicSquare

size由用户通过命令行参数定义。

如果上面编写的函数完成了置换值的任务,我会感到有些困惑。

4

2 回答 2

5

它似乎不会而且实际上应该基本上永远不会终止它当前的编写方式。

开始思考这个问题的一个简单方法是,一个幻方可以用一个大小为 的列表来表示n**2,所以一个 3x3 的幻方可以用一个 9 长的列表来表示。由于它是一个幻方,因此您需要对这些值进行置换range(1,n+1),例如,对于 3x3:

1 2 3
4 5 6
7 8 9

检查这是否是一个幻方(不是,因为行的总和值不同),如果是,请将其添加到您的幻方列表中。无论哪种方式,尝试下一个排列:

1 2 3
4 5 6
7 9 8

…直到你没有排列。当然,这是一条非最优路线,因为故障行 (1, 2, 3) 的总和仍不会为 15,因此有明显的优化空间并容易丢弃不起作用的可能性。

一个简单的工具来检查你的工作或为你做排列件是itertools.permutations。这将创建一个生成器,该生成器将产生每个额外的排列,直到不再有。

请注意,如果您每次尝试使用此方法进行另一个递归调用,那么对于任何超出微不足道的平方大小的内容,您都将超过最大递归限制。你需要找到一种方法来管理这种情况size=3。有几种方法可以处理不同程度的复杂性,具体取决于您正在尝试做什么。

于 2011-12-12T05:03:53.590 回答
0

这是检查幻方与否的简单方法。

注意:请尝试使用 3*3 网格。

def magic():
    print "maximam 9 values"
    a=[]
    for i in range(3):
        a.append([])
        for j in range(3):
            a[i].append(input('Enter the values'))
    print a
    l1= a[0][0]+a[1][0]+a[2][0]
    l2=a[0][1]+a[1][1]+a[2][1]
    l3=a[0][2]+a[1][2]+a[2][2]
    r1=sum(a[0])
    r2=sum(a[1])
    r3=sum(a[2])
    if l1 == l2 == l3 == r1 == r2 == r3:
        print a,"Its magic square"
    else:
        print a,"not magic square"
magic()
于 2014-08-13T11:11:27.377 回答