Tuyến đường ngắn nhất thông qua hệ thống một chiều


9

Thành phố quê hương của tôi, Rhyl , có một hệ thống giao thông một chiều dường như được thiết kế để giữ mọi người tránh xa điểm đến của họ càng lâu càng tốt. Nhiệm vụ của bạn, nếu bạn chọn thử nó, là tạo ra một chương trình để đưa ra con đường ngắn nhất thông qua một hệ thống giao thông như vậy.

Đầu vào

Đầu vào sẽ được bật STDINvà sẽ là một danh sách các điểm bắt đầu và điểm kết thúc theo sau là một dòng trống theo sau là một danh sách các truy vấn, như sau:

A B
B A
B C
C D
D C

A D
C A
B A

Mỗi đường chỉ có thể được đi theo (các) hướng đã cho, vì vậy, trong ví dụ trên, đường A - B là đường hai chiều trong khi B - C là đường một chiều từ B đến C. Đi từ C đến B bị cấm.

Điểm bắt đầu và điểm kết thúc sẽ được thể hiện bằng một chữ cái viết hoa.

Đầu ra

Đầu ra phải là tuyến đường ngắn nhất (được đo bằng số điểm đã truy cập) từ điểm bắt đầu nhất định đến điểm kết thúc đã cho cho mỗi truy vấn nhận được. Nếu không có tuyến đường như vậy tồn tại, xuất ra một dòng trống. Nếu có nhiều tuyến ngắn nhất tồn tại, hãy xuất đầu tiên khi sắp xếp tất cả các tuyến ngắn nhất theo từ vựng.

Đối với ví dụ trên, đầu ra sẽ là:

A B C D

B A

Kiểm tra tập lệnh

Như trước đây tôi đang cung cấp các bài kiểm tra cho nhiệm vụ này dựa trên các kịch bản được viết bởi JoeyVentero : -

và cũng kiểm tra và đầu ra dự kiến ​​cho bất cứ ai không thể sử dụng các tập lệnh trên

Sử dụng: ./test [your program and its arguments]

Phần thưởng

Tất cả các câu trả lời rõ ràng đã có một số nỗ lực để chơi golf đáp ứng thông số kỹ thuật và vượt qua tất cả các bài kiểm tra sẽ nhận được sự ủng hộ của tôi. Câu trả lời ngắn nhất vào ngày 26/01/2012 sẽ được chấp nhận.


output the first when sorting all shortest routes lexicographically- Vậy nếu A B DA C Dcả hai đều là giải pháp hợp lệ, đầu ra A B Dthay thế?
Ông Llama

@GigaWatt Vâng, đúng vậy.
Gareth

Điều này cực kỳ gần với một bản sao của codegolf.stackexchange.com/questions/3474/ mẹo
Peter Taylor

1
@PeterTaylor Tại sao bạn không nêu ra điều đó trong khi nó nằm trong hộp cát câu hỏi? Bạn có đề nghị gì? Tôi có thể xóa nó trong khi không có câu trả lời trên đó, tôi cho rằng?
Gareth

@Gareth, vì lần đầu tiên có hoạt động trên một vài chủ đề trên meta cùng một lúc và tôi không nhận thấy rằng có một câu trả lời mới trong hộp cát câu hỏi. Xóa là một khả năng; hoặc bạn có thể mở rộng nó để cân các cạnh - chúng tôi chưa có câu hỏi Dijkstra trực tiếp nào.
Peter Taylor

Câu trả lời:


3

Haskell, 223 207 ký tự

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 ký tự

Tất cả các lời khuyên và ý kiến ​​chào mừng!

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))

Nên vượt qua các bài kiểm tra trong hình thức này. Đầu vào thức ăn thông qua stdin, ví dụ python shortestroute.py < test.txt.


Có vẻ như không truy vấn 2 của bài kiểm tra 4. Trả về A B I J Mthay vì A B G J M.
Gareth

@Gareth: thực sự có một lỗi nhỏ khi xem xét loại giải pháp độ dài tương tự, nên được sửa ngay bây giờ ...
BarsheD

1

C: 450 , 437 , 404 , 390 ký tự

#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")in hai dòng mới. puts()tự động thêm một bộ kết thúc cuối dòng vào chuỗi nó in. Để tránh hành vi đó, sử dụng fputs(str, stdout)hoặc đơn giản printf(str).
JB

Uốn nhẹ các quy tắc - nên lấy tất cả đầu vào trong một lần và sau đó xuất tất cả các câu trả lời cho các truy vấn trong một lần. Tôi sẽ +1 nó vì nó hoạt động tốt (và tìm thấy lỗi trong các thử nghiệm), nhưng tôi sẽ không thể chấp nhận nó trong một chương trình dài hơn, tuân thủ đầy đủ các yêu cầu đầu vào / đầu ra.
Gareth

@Gareth: đã sửa. tuy nhiên, đầu ra câu trả lời không được dài hơn 9999 ký tự!
Ali1S 232
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.