Permuting Magic Squares

时间:2011-12-12 04:33:22

标签: python recursion permutation magic-square

我在编写用于解决Magic Squares的递归排列函数方面遇到了一些麻烦。对于这个函数,我不允许使用二维数组,只能使用列表。以下是我目前的情况:

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

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

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

2 个答案:

答案 0 :(得分:5)

它似乎并不会实际上基本上不会终止它当前编写的方式。

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

1 2 3
4 5 6
7 8 9

检查这是否是一个魔方(它不是rows don't sum to the same value),如果是,请将其添加到魔方列表中。无论哪种方式,尝试下一个排列:

1 2 3
4 5 6
7 9 8

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

itertools.permutations是一个简单的工具,可以检查您的工作或为您做排列。{3}}。这将创建一个generator,它将产生每个额外的排列,直到不再存在。

请注意,对于超出平凡大小的任何内容,如果每次使用此方法尝试再次进行递归调用时,将超过最大递归限制。 size=3之后,您需要找到一种方法来管理这种情况。有几种方法可以处理不同程度的复杂程度,具体取决于您的具体操作。

答案 1 :(得分: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()