2012-03-19 2 views
3

Я новичок в Python, и я пытался разобраться в проблеме интервьюирования Kingdom Connectivity. Хотя мне удалось решить проблему, у меня возникли проблемы с предоставлением ввода данного формата, я пробовал свое решение в своей системе, и результат верный, но как только я скомпилирую там, выхода нет.Как читать несколько строк ввода в python

ввода имеет вид:

5 5 
1 2 
2 3 
3 4 
1 3 
4 5 

Пожалуйста, помогите мне понять, как решить эту проблему.

В настоящее время я принимаю ввод от raw_input() в цикле и разбивается с использованием a.split(' ').

Вот часть вопроса:

**Input Description:** 

First line contains two integers N and M. 

Then follow M lines ,each having two integers say x and y, 1<=x,y<=N , indicating there is a road from city x to city y. 

**Output Description:** 

Print the number of different paths from city 1 to city N modulo 1,000,000,000(10^9).If there are infinitely many different paths print "INFINITE PATHS"(quotes are for clarity). 

**Sample Input:** 

5 5 
1 2 
2 4 
2 3 
3 4 
4 5 

**Sample Output:** 

2 

**Sample Input:** 

5 5 
1 2 
4 2 
2 3 
3 4 
4 5 

**Sample Output:** 

INFINITE PATHS 

Вот мое решение

import sys 
import numpy as np 
c=0 
x=raw_input() 
y=x.split(' ') 
l=(int(y[0]),int(y[1])) 
e=[raw_input() for i in range(l[1])] 
f=[e[i].split(' ') for i in range(l[1])] 
a=[map(int,i) for i in f] 
b=[[0 for i in a] for j in range(l[0])] 
for i in range(l[0]+1): 
    for j in range(l[0]+1): 
     if [i,j] in a: 
      b[i-1][j-1]=1 
     elif a[i-1][0]>=a[i-1][1]: 
      print "INFINITE PATHS" 
      sys.exit(0) 
for i in range(0,l[1]): 
    d=np.linalg.matrix_power(b,i+1) 
    c+=d[0][l[1]-1] 
print c 

Вот скриншот enter image description here

+2

Сообщите нам код, чтобы мы могли видеть, где находится ошибка. – hochl

+0

Btw - это домашнее задание? Если да, отметьте его как таковой. – hochl

+0

@hochl Я отредактировал и добавил свой код – sum2000

ответ

1

Вы можете прочитать указанный вход следующим образом:

line = raw_input() 
n, m = map(int, line.split()) 

for _ in range(m): 
    line = raw_input() 
    x, y = map(int, line.split()) 
    print x, y 
+0

, как хранить значения [x, y] в списке a ..? – sum2000

+1

использовать 'a.append ([x, y])' (после инициализации 'a = []' перед циклом) – Aprillion

+1

Разве это не эквивалентно тому, что делает OP? – WolframH

0

если у вас есть вход в файл input.txt в той же папке, что и сценарий:

with open("input.txt") as f: 
    l = [int(i) for i in f.readline().split(" ")] 
    a = [] 
    for line in f.readlines(): 
     a.append([int(i) for i in line.strip().split(" ")]) 
print(l, a) 

если вход передается в качестве аргумента командной строки:

import sys 
input_string = sys.argv[1] 
print(input_string) # test if this prints the input 
... 
+0

Мне нужно запустить код без ввода txt-файла. – sum2000

+0

@ sum2000, если это не аргумент командной строки или входной файл, я не думаю, что мы можем понять это, угадывая, не спрашивая задающего дарителя/читающего все инструкции – Aprillion

+0

@deathApril, заявление о проблеме делает это довольно ясным: вход - это просто стандартный ввод, а sum2000 правильно использует 'raw_input()' для чтения ввода. Вы можете проверить свой ввод, скопировав номера примеров из инструкции проблемы и вставляя их в программу Python по мере ее запуска; или помещая их в файл и передавая содержимое файла в программу Python. – steveha

3

Я нашел вашу программу трудной для понимания. Итак, я переписал его, и я думаю, что моя версия немного понятна.

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, и я ничего не вижу для обеспечения этого.

 Смежные вопросы

  • Нет связанных вопросов^_^