Python调试中的魔术广场

时间:2015-09-12 10:31:45

标签: python-2.7 debugging magic-square

问题最初位于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

问题陈述

魔术广场

约翰尼设计了一个魔方(所有行,列和对角线的数字正方形相同,即主对角线 - 意味着从左上角到右下角的对角线 - 以及反对角线 - 意思是从右上角到左下角的对角线。写一个程序来测试它。

任务
编写一个程序,检查给定的方格是否是魔术(即所有行,列和对角线的总和相同)。

输入
第一行:N,正方形的大小(1 <= N <= 600)。 接下来的N行:正方形,N个空格分隔整数前面的行,表示每个行的每个行的条目。

输出
第一行: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 个答案:

答案 0 :(得分:0)

您的解释并未讨论此条款,这是潜在的错误来源:

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,对角线仍然相等,但方块无效。所以上面的代码看起来并不正确。在上述else语句的if子句中,您可以测试:

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

你已经知道从前一个/外部测试中得到的事实,所以你的代码似乎与它自己不一致。