SPOJ:运行时错误(NZEC)
我在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中,这种情况并不总是成立,很多输入文件都是格式不正确的,你可以在其他案例中看到,格式不正确的输入会导致本来正确的程序失败。