我在编写用于解决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
由用户通过命令行参数定义。
如果上面写的函数完成了置换值的任务,我会感到有些困惑。
答案 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()