SPOJ:运行时错误(NZEC)

1 投票
2 回答
671 浏览
提问于 2025-04-18 03:17

我在spoj.com上尝试做这个题目,但是总是遇到运行时错误(NZEC)。我用的是Python编程。我不知道为什么会这样。以下是我的代码:

import sys

def unique(lines, exact=True):
    for L in lines:
        if L.count('#') != 1 and exact:
            return False
        if L.count('#') > 1 and not exact:
            return False
    return True

def resolve(N, lines):

    diags = [ 
             [lines[i][i+j] for i in range(max(0, -j), min(N, N-j))]
             for j in range(-N+1, N)]
    anti_diags = [ 
             [lines[i][N-1 -(i+j)] for i in range(max(0, -j), min(N, N-j))]
             for j in range(-N+1, N)]
    if unique(lines) and unique(zip(*lines)) and unique(diags, False) and unique(anti_diags, False):
        return "YES"
    return "NO" 



input_file = sys.stdin
output_file = sys.stdout

T = int(raw_input())
for i in range(1, T + 1):

    n = int(raw_input())

    lines = []
    for _ in range(n):
        line = raw_input().strip()
        lines.append(list(line))

        print resolve(n, lines)

在本地测试时,输入像这样是可以正常工作的:

2
3
..# 
#..
.#.
4
.#..
...#
#...
..#.

2 个回答

2

Spoj不使用sys和sys.stdin、sys.stdout。要用raw_input()和print。

“我在Windows上,不是在Linux上。我只是把这一行改成控制台模式来进行测试。”

在任何编程语言和操作系统中,这些都能正常工作。

#for Python 
spoj.py < input.txt  > output.txt 

#If you are using C/C++, for any EXE file 
spoj.exe < input.txt  > output.txt 

Spoj不会在你的电脑上测试,也不会使用任何用户界面。他们会在一个“控制台”中测试你的代码,这可能是Linux或其他操作系统的机器。使用这个输入/输出去测试你的代码。

5

当我运行你的代码时,出现了以下错误:

$ python spoj.py < input
Traceback (most recent call last):
  File "spoj.py", line 38, in <module>
    print resolve(n, lines)
  File "spoj.py", line 15, in resolve
    for j in range(-N+1, N)]
IndexError: list index out of range

这就是你遇到的运行时错误。但问题其实出在这一部分:

for _ in range(n):
    line = raw_input().strip()
    lines.append(list(line))

    print resolve(n, lines)

因为打印语句缩进了,你的程序只读取了一行,然后就把内容加到行里,并在读取后面的行之前调用了resolve。去掉多余的缩进后,我的电脑上就能正常运行了。

这个程序还有很多可以改进的地方,无论是风格还是逻辑。如果你需要更多建议,随时告诉我。

编辑:

你在评论中提到这个缩进问题是复制粘贴时出错了。在这种情况下,正如sp1r在评论中指出的,问题页面上的一条评论也提到,在线评测系统使用的输入可能格式不正确。

在这种情况下,你需要对输入进行更严格的解析,因为它可能没有按照示例输入的格式来。也就是说,不是:

 2
 3
 ..# 
 #..
 .#.
 (etc)

你可能会遇到更像这样的情况:

2 3
..# 
#.. .#.
(etc)

这可能会导致你的代码出错,因为它假设发布问题的人有能力提供一个看起来像示例的输入。但在SPOJ中,这种情况并不总是成立,很多输入文件都是格式不正确的,你可以在其他案例中看到,格式不正确的输入会导致本来正确的程序失败。

撰写回答