【问题标题】:Magic square in pythonpython中的魔方
【发布时间】:2018-11-18 22:36:38
【问题描述】:

我是编码新手。我正在尝试编写一个魔方。幻方是一个正方形(在我的情况下为 3 × 3,可能不同),其中所有行、列和对角线的总和必须为某个数字(在我的情况下为 15,因为 3 × 3)。这是我的代码:

s = []
while len(s) < 9:
    n = 0
    a = random.randrange(1, 10)
    while a not in s:
        s.append(a)


while s[0] + s[1] + s[2] != 15 and s[3] + s[4] + s[5] != 15 and \
        s[6] + s[7] + s[8] != 15 and s[0] + s[4] + s[8] != 15 \
        and s[2] + s[4] + s[6] != 15 and s[0] + s[3] + s[6] != 15 and \
        s[1] + s[4] + s[7] != 15 and s[2] + s[5] + s[8] != 15:
    shuffle(s)
print(s)

我不明白为什么在 while 循环中满足所有条件之前程序不洗牌。我知道这不是编写这个程序的方法,即使它可以工作,也将是随机性和暴力破解解决方案,我只想了解 while 循环内部发生了什么。

【问题讨论】:

    标签: python while-loop magic-square


    【解决方案1】:

    我认为您的循环条件写错了。它目前要求 none 的行、列或对角线加起来是正确的值。如果它们中的任何一个这样做,它就会退出,因为链接的 ands 会导致 False 值。

    相反,我认为您想使用 or 运算符而不是 and 运算符。这样,只要 任何 条件为真(意味着任何行没有正确加起来),您就会一直循环。

    或者,您可以保留and 运算符,但将!= 运算符更改为== 并在最后否定整个事情(因为not X or not Y 在逻辑上等同于not (X and Y)):

    while not (s[0] + s[1] + s[2] == 15 and s[3] + s[4] + s[5] == 15 and 
               s[6] + s[7] + s[8] == 15 and s[0] + s[4] + s[8] == 15 and
               s[2] + s[4] + s[6] == 15 and s[0] + s[3] + s[6] == 15 and
               s[1] + s[4] + s[7] == 15 and s[2] + s[5] + s[8] == 15):
    

    【讨论】:

    • 非常感谢,是的,你是对的,只要满足第一个条件,while循环就会停止,因为它需要同时满足所有条件,但我们刚刚解决了一个标准......所以它不再洗牌了。再次感谢您!
    【解决方案2】:

    我认为您的意思是用“or”替换您的“ands”。一旦满足第一个条件,程序就会终止,因为从逻辑上讲,您编写程序的方式需要满足所有这些条件才能继续。此外,虽然不是绝对必要的,但我通常发现个别逻辑条件周围的括号往往会有所帮助。

    s = []
    while len(s) < 9:
        n = 0
        a = random.randrange(1, 10)
        while a not in s:
            s.append(a)
    
    
    while (s[0] + s[1] + s[2] != 15) or (s[3] + s[4] + s[5] != 15) or \
        (s[6] + s[7] + s[8] != 15) or (s[0] + s[4] + s[8] != 15) \
        or (s[2] + s[4] + s[6] != 15) or (s[0] + s[3] + s[6] != 15) or \
        (s[1] + s[4] + s[7] != 15) or (s[2] + s[5] + s[8] != 15):
        shuffle(s)
    print(s)
    

    【讨论】:

    • 请举例说明它如何使用 OR 作为没有示例的答案来吸引反对票。
    • 非常感谢,是的,阅读您的评论我刚刚意识到,只要满足第一个条件,它就会停止,因为此时不再“激活”(缺少一个条件)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多