【问题标题】:Magic Square in Python DebuggingPython 调试中的魔方
【发布时间】:2015-09-12 10:31:45
【问题描述】:

问题最初在this 链接中。我写了一个 Python 代码,但我得到了 64 分(总分是 100),这表明我的代码有一些缺失的点。我通过了 16 个测试用例中的 11 个,但 5 个测试用例对我来说有问题。你能说我的代码哪里有一些缺失点,我该如何解决?

import math

m = int(raw_input())
liste = []
y_liste = []
md = 0
ad = 0
sum = 0
sum2 = 0

for k in range(m):
    temp = str(raw_input())
    liste.append(temp)
    liste[k] = liste[k].split(" ")
    liste[k] = [int(i) for i in liste[k]]

for k in range(m):
    md += liste[k][k]
    ad += liste[k][m-k-1]



if md == ad:
    print 0
else:
    for k in range(m):
        for l in range(m):
            sum2 += liste[l][k]
            sum += liste[k][l]
        if sum2 != md and -(k+1) is not y_liste:
            y_liste.append(-(k+1))
        if sum != md and (k+1) is not y_liste:
            y_liste.append(k+1)
        sum2 = 0
        sum = 0

    if md != ad:
        y_liste.append(0)
    print len(y_liste)
    y_liste.sort()
    for i in y_liste:
        print i

问题陈述

魔方

Johnny 设计了一个幻方(所有行、列和对角线的总和相同的数字平方,即主对角线 - 即从左上角到右下角的对角线 - 和对角线 -表示从右上角到左下角的对角线)。编写一个程序来测试它。

任务
编写一个程序来检查给定的正方形是否是魔法的(即所有行、列和对角线的总和都相同)。

输入
第一行: N ,正方形的大小 (1

输出
第一行: M ,总和不等于主对角线之和的行数(即包含正方形第一个元素的行)。如果 Square 很神奇,程序应该输出 0。 接下来的 M 行:总和不等于主对角线之和的行的排序(按递增顺序)列表。行编号为 1,2,…,N;列编号为 -1、-2、…、-N;对角线编号为零。

注意:输出的最后一行末尾有一个换行符。
示例输入 1
3
8 1 6
3 5 7
4 9 2

样本输出 1
0

示例输入 2
4
16 3 2 13
5 10 11 8
6 9 7 12
4 15 14 1

样本输出 2
3
-2
-1
0

示例输出说明 2
输入方块如下所示:http://i.stack.imgur.com/JyMgc.png (抱歉链接,但由于声誉问题,我无法添加图片)

如上图所示,该正方形有 4 行(橙色标记为 1 到 4)和 4 列(绿色标记为 -1 到 -4)。正方形的主对角线和对角线分别以红色和蓝色突出显示。

主对角线的和 = 16 + 10 + 7 +1 = 34。
对角线的总和 = 13 + 11 + 9 + 4 = 37。这与主对角线的总和不同,因此应报告对应于对角线的值 0。
第 1 行的总和 = 16 + 3 + 2 + 13 = 34。
第 2 行的总和 = 5 + 10 + 11 + 8 = 34。
第 3 行的总和 = 6 + 9 + 7 + 12 = 34。
第 4 行的总和 = 4 + 15 + 14 + 1 = 34。
-1 列的总和 = 16 + 5 + 6 + 4 = 31。这与主对角线的总和不同,因此应报告值 -1。
-2 列的总和 = 3 + 10 + 9 + 15 = 37。这与主对角线的总和不同,因此应报告值 -2。
-3 列的总和 = 2 + 11 + 7 + 14 = 34。
-4 列的总和 = 13 + 8 + 12 + 1 = 34。
基于以上,有3条线的总和不等于主对角线元素的总和。由于它们应按递增顺序排序,因此输出应为:
3
-2
-1
0

【问题讨论】:

  • 您能否重新表述您的问题,以便仅列出本质,特别是对您有问题的五个测试用例? (即,测试用例是什么,你得到什么输出/你的程序没有得到正确的部分(例如,它没有得到正确的对角线总和吗?)。
  • 我无法在您的描述中轻易找到这些幻方是否允许多次使用相同的数字(通常,每个方格只有一个数字);或者数字是否需要连续(1、2、3 ...);或者数字是否从 1、0 或任何地方开始?
  • 只给出了前2个测试用例,那里没有问题。没有看到其他 14 个测试用例。程序自动填充和测试其他测试用例,并说明哪些测试通过或未通过。
  • @Evert 我不明白你在第二条评论中说了什么,但如果我明白了,我会稍微解释一下。程序的第一个输出(我在 else 语句之后谈论)指的是序列的长度(例如,这是 3)引用报告的行/列的其他打印。(-2,-1)但还有一个事物。输出在序列长度之后按递增顺序排列。

标签: python-2.7 debugging magic-square


【解决方案1】:

您的解释没有讨论这个可能导致错误的子句:

if md == ad:
    print 0
else:

它表示如果主对角线和对角线加起来相同的值,则只打印一个 0(没有坏线),表示幻方是有效的(与在坏线列表中报告 0 不同)。考虑这个有效的幻方:

 9  6  3 16
 4 15 10  5
14  1  8 11
 7 12 13  2

如果我交换 13 和 11,对角线仍然相等,但正方形无效。所以上面的代码似乎不正确。在上述if 语句的else 子句中,您测试:

if md != ad:
    y_liste.append(0)

您已经从先前/外部测试中知道这一事实是正确的,因此您的代码似乎与自身不一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多