使“幻方”不起作用的代码

2024-04-19 00:10:32 发布

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

我做魔方有问题。幻方是所有行和列的和都相同的数字的平方。 例如:
1 2 14
3 13 1
13 2
我不知道我的代码出了什么问题,但它应该从中读取三个数字magicin.txt文件然后从那里强制平方并将输出写入magicout.txt文件你知道吗

我之所以编写这个代码是因为它在所有练习题中。网站是: http://orac.amt.edu.au/cgi-bin/train/problem.pl?set=aio16int&problemid=902

如果需要进一步的澄清或任何东西,请评论。代码在这里(它有一堆无用的打印和“按回车键退出”语句用于调试):

def Main():
file=open("magicin.txt","r")
magicin=file.read()
file.close()
num1="" 
num2="" 
num3=0 
num4="" 
num5=0 
num6=0 
num7=0 
num8=0 
num9=0 
indices = [i for i, x in enumerate(magicin) if x == " "]
splitSpace2=indices[1]
splitSpace=indices[0]
for x in range(splitSpace):
    num1+=magicin[x]
for x in range(splitSpace+1,splitSpace2):
    num2+=magicin[x]
for x in range(splitSpace2+1,len(magicin)):
    num4+=magicin[x]
num1=int(num1)
num2=int(num2)
num4=int(num4)
for x in range(20):
    num3=x
    sum=num1+num2+num3
    num7=sum-num1
    if num7<0:
        print("Falied with num7="+str(num7))
    else:
        for y in range(20):
            num5=y
            for z in range(20):
                num6=z
                if num6+num5+num4==sum:
                    for a in range(20):
                        num8=a
                        if num8+num2+num5==sum:
                            for b in range(20):
                                num9=b
                                if num9+num8+num7==sum and num9+num6+num3==sum:
                                    answer=[str(num1),str(num2),str(num3),str(num4),str(num5),str(num6),str(num7),str(num8),str(num9)]
                                    file=open("magicout.txt","w")
                                    file.write(answer[0]+" "+answer[1]+" "+answer[2]+"\n"+answer[3]+" "+answer[4]+" "+answer[5]+"\n"+answer[6]+" "+answer[7]+" "+answer[8])
                                    file.close()
                                    return
                                else:
                                    print("failed with num9+num8+num7==sum and num9+num6+num3==sum"+" "+str(num9)+" "+str(num8)+" "+str(num7)+" "+str(sum),str(num9),str(num6),str(num3),str(sum))

                        else:
                            print("Failed with num8+num2+num5==sum",str(num8),str(num2),str(num5),str(sum))

                else:
                    print("Failed with num6="+str(num6)+" num5="+str(num5),"num4="+str(num4),"sum="+str(sum))
    if x==19:
        print(num1,num2,num3,num4,num5,num6,num7,num8,num9)
        wait=input("")
        file=open("magicout.txt","w")
        file.write("none")
        file.close()
answer=Main()

谢谢


Tags: answerinforfilesumstrnum2num1
1条回答
网友
1楼 · 发布于 2024-04-19 00:10:32

我最近完成了这个问题,它实际上很简单。在普通的幻方中,你不能重复任何数字。但是,AIO问题允许您随时重复数字。因此,出现了一种令人惊讶的对称性。你知道吗

如果我让幻数为m,我可以用下面的形式写出我的幻方:

a       b       m-(a+b
c       m-(b+c) b
m-(a+c) c       a

因此,您可以用简单的数学创建一个幻方。您只需测试m,以便m-(a+c)m-(a+b)中的较大值介于1和20之间。你需要做的就是看看你的平方的中间数是否大于1。所有其他的数字在任何情况下都是有效的。由此,我用python编写了以下代码:

infile = open("magicin.txt", "r")
outfile = open("magicout.txt", "w")
split = infile.readline().split()
n1 = int(split[0])
n2 = int(split[1])
n4 = int(split[2])
square = [ [n1, n2, 0], [n4, 0, 0], [0, 0, 0]]
minmagic = max(square[0][0] + square[0][1], square[0][0] + square[1][0]) + 1 #lowest possible magic number
maxmagic = max(square[0][0] + square[0][1], square[0][0] + square[1][0]) +20 #highest possible magic number
for magic in range(minmagic, maxmagic + 1):
square[2][0] = magic - (square[0][0] + square[1][0]) #fill bottom left corner
square[0][2] = magic - (square[0][0] + square[0][1]) #fill top right corner
square[2][2] = square[0][0] #fill bottom right
square[2][1] = square[1][0] #fill bottom edge
square[1][2] = square[0][1] #fill right edge
square[1][1] = magic - (square[0][1] + square[2][1]) #fill middle of square
if square[1][1] > 0: # if middle is greater than 0, you've found a square, so break the for loop.
    break
outfile.write(str(square[0][0]) + " " + str(square[0][1]) + " " + str(square[0][2]) + "\n")
outfile.write(str(square[1][0]) + " " + str(square[1][1]) + " " + str(square[1][2]) + "\n")
outfile.write(str(square[2][0]) + " " + str(square[2][1]) + " " + str(square[2][2]) + "\n")

我希望这有帮助!你知道吗

相关问题 更多 >