Я нашел вашу программу трудной для понимания. Итак, я переписал его, и я думаю, что моя версия немного понятна.
import sys
import numpy as np
line = raw_input()
max_val, num_paths = (int(n) for n in line.split())
# a will be a list of tuples of int, taken from the input.
#
# Each tuple represents a path, so this is effectively a sparse representation
# of a square matrix of possible paths.
#
# Input city numbers are 1-based, but we will treat them as 0-based, so
# subtract 1 from each value before appending to array a.
a = []
for _ in xrange(num_paths):
line = raw_input()
# TRICKY: subtract 1 to convert from 1-based to 0-based city numbers
tup = tuple(int(n)-1 for n in line.split())
if len(tup) != 2:
raise ValueError, "input should only have two values per line"
for n in tup:
if not 0 <= n < max_val:
raise ValueError, "value must be in range [1, %d]" % max_val
if tup[0] >= tup[1]:
#raise ValueError, "INFINITE PATHS"
print "INFINITE PATHS"
sys.exit(0)
a.append(tup)
# Expand the sparse matrix representation into an actual square matrix.
# It should have a 1 anywhere a path was indicated with a tuple in list a,
# and a 0 everywhere else.
b = [ [0 for _ in xrange(max_val)] for _ in xrange(max_val)]
for i, j in a:
b[i][j] = 1
c = 0
for i in xrange(num_paths):
d = np.linalg.matrix_power(b, i + 1)
c += d[0][max_val - 1]
print c
Моя версия делает печать 2
когда дается пример ввода.
Вот некоторые вещи, я понял, как я работал над этим:
Первая строка дает нам константу (N
и M
в документации, представляющая максимальное юридическое значение и количество дорожек соответственно). Эти значения следует сохранять в переменных с хорошими именами, а не помещать их в список и ссылаться на них по индексу списка. Я использовал имена max_val
и num_paths
. Вы сами допустили ошибку: вы должны найти пути от города 1 до города N, поэтому проверка в конце должна быть d[0][max_val - 1]
; вы использовали l[1]
, который является num_paths
, а не l[0]
.
b
должно быть квадратной матрицей. Ваш код устанавливал ширину в соответствии с длиной a
, но max_val
и num_paths
не всегда были равны, поэтому это опасный способ сделать это.
Странно перебирать каждую возможную точку квадратной матрицы и проверять, должно ли оно быть установлено как 1 или нет.Это также очень неэффективно, особенно потому, что тест in
равен O (n), где n - длина массива a
. Вместо этого создайте пустую квадратную матрицу, а затем просто перейдете по путям и установите 1 значение для каждого пути.
Также странно проверять входные значения в цикле, который инициализирует квадратную матрицу; лучше проверить входные значения, поскольку они считываются во входном цикле. И снова это опасно, потому что num_paths
может быть не связан с max_val
. Также это неэффективно, потому что вы проверяли a[i-1][0]
против a[i-1][1]
один раз за столбец в b
; что сравнение не использует значение j
. Вы делали каждую проверку пять раз; достаточно сделать каждый чек один раз.
Существует идиома Python, которую я использовал, где вы можете использовать _
(одно подчеркивание) в качестве имени переменной, если вам не важно значение этой переменной. Когда мы просто делаем что-то определенное количество раз с циклом, и мы не будем использовать значение счетчика циклов для чего-либо, я использовал _
в качестве переменной счетчика циклов. Конечно, это не обязательно.
Чтобы ответить на ваш реальный вопрос: я не вижу возможности для вашей программы не производить вывод. Я подозреваю, что на сервере может возникнуть проблема, которая запускает эту тестовую проблему. Ваша программа всегда должна либо печатать «INFINITE PATHS», либо какое-то целое значение.
P.S. Я не понимаю, как работает ваша программа; в описании проблемы говорится, что вы должны предоставить несколько путей по модулю 1е9, и я ничего не вижу для обеспечения этого.
Сообщите нам код, чтобы мы могли видеть, где находится ошибка. – hochl
Btw - это домашнее задание? Если да, отметьте его как таковой. – hochl
@hochl Я отредактировал и добавил свой код – sum2000