Найкоротший шлях у графіку


12

Напишіть програму, щоб взяти графік (зі стандартного вводу або з файлу, на ваш вибір) і знайдіть найкоротший шлях у графіку.

Графіки задаються у наступному форматі:

A---S   F--T
|  / \  |
| /   5 0
|/     \|
D----3--E

    A-Z: nodes in the graph
   -|/\: edges in the graph
    0-9: weights on the edges
<space>: all the holes

Всі ребра є непрямими і лежать уздовж одного з 8 кардинальних напрямків (тобто відсутні вигини). Краї можуть необов'язково містити вагу від 0 до 9. Вага не буде на останньому символі, який з'єднує край із вузлом (тобто краї повинні мати принаймні 3 символи, щоб містити вагу). Невагомі ребра мають типову вагу 1.

Ваш код повинен обчислити найкоротший шлях між вузлами Sі Tта надрукувати довжину і шлях, як це:

5:SDEFT

Найкоротша правильна програма виграє.


1
Чи потрібно розбирати графічну діаграму чи ви можете використовувати власний формат? Один приклад формату - ваш графік може бути представлений у вигляді: AS0,SD0,SE5,DE3,FE0,FT0(ви можете опустити коми, якщо кожен запис має три байти.)
Томас О

1
Так, ви повинні проаналізувати графік, як я вказав. В цьому і полягає більшість проблем. Найкоротша частина шляху просто гарантує правильний аналіз.
Кіт Рендалл

3
Формат введення насправді занадто складний, і imho насправді не додає такої великої проблеми.
JPvdMerwe

1
Просто думав, що люди хочуть спробувати щось більш складне.
Кіт Рендалл

2
@SimpleCoder: Я б припустив
монопростір

Відповіді:


5

Ось мій код, 494 символи в python:

import sys,re
m=sys.stdin.readlines()
Z=lambda c,s:re.findall(r'(\w)%s+(\d*)[^\w]*(\w)'%c,''.join(x*2for x in s))
T=lambda n:''.join(x for a in map(None,*n)for x in a if x)
E=Z('-',''.join(m))+Z('\\|',T(m))+Z('/',T(' '*m.index(s)+s for s in m))+Z('\\\\',T(' '*m[::-1].index(s)+s for s in m))
E+=[x[::-1]for x in E]
S={}
for x in E:S[x[0]]=1e9
S['S']=0
P={}
for i in E:
 for x,w,y in E:
  w=int('1'+w)%10
  if S[y]>S[x]+w:S[y]=S[x]+w;P[y]=x
i=p='T'
while i!='S':i=P[i];p=i+p
print'%d:'%S['T']+p
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.