Đường đi ngắn nhất trong đồ thị


12

Viết chương trình lấy biểu đồ (từ đầu vào tiêu chuẩn hoặc tệp, lựa chọn của bạn) và tìm đường dẫn ngắn nhất trong biểu đồ.

Đồ thị được chỉ định bằng cách sử dụng định dạng sau:

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

Tất cả các cạnh là vô hướng và nằm dọc theo một trong 8 hướng chính (nghĩa là không có uốn cong). Các cạnh có thể tùy ý chứa trọng số từ 0 đến 9. Trọng lượng sẽ không nằm trên biểu tượng cuối cùng kết nối cạnh với một nút (tức là các cạnh cần phải có ít nhất 3 ký hiệu để chứa trọng số). Các cạnh không có trọng số có trọng số mặc định là 1.

Code của bạn nên tính toán đường đi ngắn nhất giữa các nút STvà in theo chiều dài và đường dẫn, như thế này:

5:SDEFT

Chương trình đúng ngắn nhất sẽ thắng.


1
Biểu đồ có phải được phân tích cú pháp hay bạn có thể sử dụng định dạng của riêng mình không? Một ví dụ về định dạng - biểu đồ của bạn có thể được biểu diễn dưới dạng: AS0,SD0,SE5,DE3,FE0,FT0(bạn có thể bỏ qua dấu phẩy nếu mỗi mục dài 3 byte.)
Thomas O

1
Có, bạn phải phân tích biểu đồ như tôi đã chỉ định. Đó thực sự là hầu hết các vấn đề. Phần đường dẫn ngắn nhất chỉ đảm bảo phân tích cú pháp của bạn là chính xác.
Keith Randall

3
Định dạng đầu vào thực sự quá phức tạp và imho không thực sự thêm nhiều vấn đề.
JPvdMerwe

1
Chỉ cần nghĩ rằng mọi người ở đây muốn thử một cái gì đó khó khăn hơn một chút.
Keith Randall

2
@SimpleCoder: Tôi sẽ giả sử không gian đơn
JPvdMerwe

Câu trả lời:


5

Đây là mã của tôi, 494 ký tự trong 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
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.