Найкоротший маршрут через односторонню систему


9

У моєму рідному місті, Rhyl , є одностороння система руху, яка, здається, була розроблена таким чином, щоб якомога довше тримати людей подалі від місця призначення. Якщо ви вирішите спробувати це ваше завдання, - створити програму, яка дозволить провести найкоротший маршрут через таку систему руху.

Вхідні дані

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

A B
B A
B C
C D
D C

A D
C A
B A

Кожну дорогу можна проходити лише в заданому напрямку, тому у наведеному вище прикладі дорога A - B - це двостороння вулиця, тоді як B - C - одностороння вулиця від B до C. Подорож від C до B заборонено.

Початкові та кінцеві точки будуть представлені однією великою літерою.

Вихідні дані

Вихід повинен бути найкоротшим маршрутом (вимірюється кількістю відвідуваних балів) від заданої початкової точки до заданої кінцевої точки для кожного отриманого запиту. Якщо такого маршруту немає, виведіть порожній рядок. Якщо існує більше одного найкоротшого маршруту, виведіть перший при сортуванні всіх найкоротших маршрутів лексикографічно.

Для наведеного вище прикладу вихід буде:

A B C D

B A

Тестові сценарії

Як і раніше, я пропоную тести для цього завдання на основі сценаріїв, написаних Джої та Вентеро : -

а також тести та очікуваний вихід для тих, хто не може використовувати вищевказані сценарії

Використання: ./test [your program and its arguments]

Нагороди

Усі відповіді, які, очевидно, мали певну спробу гольфу, які відповідають специфікації та пройдуть усі тести, отримають мою оцінку. Буде прийнята найкоротша робоча відповідь до 26.01.2012.


output the first when sorting all shortest routes lexicographically- Отже, якщо A B Dі A C Dобидва є дійсними рішеннями, вивести A B Dзамість цього?
Містер Лама

@GigaWatt Так, саме так.
Гарет

Це жахливо близько до дублікату codegolf.stackexchange.com/questions/3474/…
Пітер Тейлор

1
@PeterTaylor Чому ти цього не підніс, поки це було в пісочниці питань? Що ти пропонуєш? Я міг би його видалити, поки на нього немає відповідей, гадаю?
Гарет

@Gareth, тому що колись у мета було одночасно діяти декілька потоків, і я не помітив, що у пісочниці запитань з’явилася нова відповідь. Видалення - одна з можливостей; або ви можете розширити його на вагу ребер - у нас ще не було направленого питання Дейкстри.
Пітер Тейлор

Відповіді:


3

Haskell, 223 207 символів

main=interact$unlines.f.break null.map words.lines
s%[f,t]=[[f]]#t where[]#_="";x#t|y@(_:_)<-[z|z<-x,last z==t]=unwords$minimum y|1<3=s&x#t
s&z=[x++[b]|x<-z,[a,b]<-s,last x==a,notElem b x];f(s,_:q)=map(s%)q

2

Python (2.x), 382 369 358 338 323 318 символів

Всі поради та коментарі вітаємо!

import os;u=str.split;l=u(os.read(0,1e9),'\n')
p,g,c=l.index(''),{},map;o=g.setdefault
def f(g,s,e,q=[]):q=q+[s];y=([],[q])[s==e];[c(y.append,f(g,n,e,q))for n in set(o(s,[]))-set(q)];return y
for k,v in c(u,l[:p]):o(k,[]);g[k]+=v
for w,e in c(u,l[p+1:]):h=sorted(f(g,w,e));print''if not h else' '.join(min(h,key=len))

Слід здати тести у цій формі. Введення подачі через stdin, наприклад python shortestroute.py < test.txt.


Здається, помилка запиту 2 тесту 4. Повертається A B I J Mзамість A B G J M.
Гарет

@Gareth: насправді була невелика помилка з урахуванням лексографічного вигляду подібних рішень за довжиною, її слід виправити зараз ...
ChristopheD

1

С: 450 , 437 , 404 , 390 символів

#include<stdio.h>
#include <string.h>
r[99][99],p[99],q[99],m[99],i,j,x,y,s;
char t[9],e[9999];
F(k)
{
    m[k]^s?r[p[k]=q[i]][k]?m[q[j++]=k]=s:0:0;
    if(++k<99)F(k);
}
f()
{
    F(0);
    if(++i^j)f();
}
P(o)
{
    if(p[o])P(p[o]);
    *t=m[o]^s?0:o;
    strcat(e,t);
}
w()
{
    gets(t);
    r[*t][t[2]]=*t?w():0;
}
W()
{
    gets(t);
    x=*t,x?y=t[j=2],s=x+y*99,m[q[t[2]=i=p[x]=0]=x]=s,f(),P(y),strcat(e,"\n"),W():0; 
}
main()
{
    w();
    W();
    puts(e);
}

puts("\n")друкує два нових рядки. puts()автоматично додає кінцевий термінатор до рядків, які він друкує. Щоб уникнути такої поведінки, використовуйте fputs(str, stdout)або просто printf(str).
JB

Правила згинає трохи - слід взяти весь вклад за один раз, а потім вивести всі відповіді на запити за один раз. Я поставлю +1 +1 тому, що він працює чудово (і виявив помилки в тестах), але я не зможу його прийняти за більш довгу програму, яка повністю відповідає вимогам введення / виводу.
Гарет

@Gareth: виправлено. однак вихід відповіді не повинен бути довшим 9999 символів!
Ali1S232
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.