Bir grafikteki en kısa yol


12

Bir grafik almak için bir program yazın (standart girdiden veya bir dosyadan, seçiminizden) ve grafikte en kısa yolu bulun.

Grafikler aşağıdaki format kullanılarak belirtilir:

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üm kenarlar yönlendirilmemiştir ve 8 kardinal yönden biri boyunca uzanır (yani kıvrım yok). Kenarlar isteğe bağlı olarak 0 ila 9 arasında bir ağırlık içerebilir. Ağırlık, kenarı bir düğüme bağlayan son sembolde olmayacaktır (yani kenarların bir ağırlık içermek için en az 3 sembol içermesi gerekir). Ağırlıksız kenarların varsayılan ağırlığı 1'dir.

Kodunuz düğümler arasındaki en kısa yolu hesaplamak gerekir Sve Tve uzunluğunu ve bunun gibi yolunu yazdırın:

5:SDEFT

En kısa doğru program kazanır.


1
Grafik diyagramı ayrıştırılmalı mı yoksa kendi biçiminizi kullanabilir misiniz? Bir biçim örneği - grafiğiniz şu şekilde temsil edilebilir: AS0,SD0,SE5,DE3,FE0,FT0(her giriş 3 bayt uzunluğunda virgülleri atlayabilirsiniz.)
Thomas O

1
Evet, grafiği belirttiğim gibi ayrıştırmalısınız. Aslında sorunun çoğu bu. En kısa yol kısmı ayrıştırma işleminizin doğru olmasını sağlar.
Keith Randall

3
Giriş formatı gerçekten çok karmaşık ve imho soruna gerçekten fazla bir şey eklemiyor.
JPvdMerwe

1
Sadece burada millet biraz daha zor bir şey denemek istiyorum düşündüm.
Keith Randall

2
@SimpleCoder: Monospace kabul ediyorum
JPvdMerwe

Yanıtlar:


5

İşte benim kod, python 494 karakter:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.