排列幻方

2024-06-10 01:31:36 发布

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

我在写一个递归排列函数来解幻方时遇到了一点麻烦。对于这个函数,我不允许使用二维数组,只允许使用列表。以下是我目前的情况:

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

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

我有点困惑,上面写的函数是否完成了置换值的任务。在


Tags: 函数inpos列表forsizevaluedef
2条回答

它看起来不会,事实上应该永远不会终止它当前的编写方式。在

开始考虑这个问题的一个简单方法是,幻方可以用大小为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开始的),如果是,就把它添加到幻方列表中。不管怎样,尝试下一个排列:

^{pr2}$

…直到你不再排列。当然,这是一个非最优路径,因为问题行(1,2,3)的总和仍然不会为15,因此有明确的优化空间,并很容易丢弃那些不起作用的可能性。在

一个简单的工具可以检查你的工作或者为你做一个排列块是^{}。这将创建一个generator,它将产生每一个额外的排列,直到没有更多的排列为止。在

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

这里有一个检查幻方与否的简单方法。在

注:请尝试使用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()

相关问题 更多 >