Percorso più breve in un grafico


12

Scrivi un programma per prendere un grafico (dall'input standard o da un file, a tua scelta) e trovare un percorso più breve nel grafico.

I grafici sono specificati usando il seguente formato:

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

Tutti i bordi sono non orientati e giacciono lungo una delle 8 direzioni cardinali (cioè senza curve). I bordi possono opzionalmente contenere un peso compreso tra 0 e 9. Il peso non sarà sull'ultimo simbolo che collega il bordo a un nodo (vale a dire che i bordi devono contenere almeno 3 simboli per contenere un peso). I bordi non ponderati hanno un peso predefinito di 1.

Il codice dovrebbe calcolare il percorso più breve tra i nodi Se le Te stampare la lunghezza e il percorso, in questo modo:

5:SDEFT

Il programma corretto più breve vince.


1
Il diagramma grafico deve essere analizzato o puoi usare il tuo formato? Un esempio di un formato: il tuo grafico potrebbe essere rappresentato come: AS0,SD0,SE5,DE3,FE0,FT0(potresti omettere le virgole se ogni voce è lunga 3 byte.)
Thomas O

1
Sì, devi analizzare il grafico come ho specificato. Questo è il problema, in realtà. La parte del percorso più breve garantisce solo che l'analisi sia corretta.
Keith Randall,

3
Il formato di input è davvero troppo complicato e imho non aggiunge molto al problema.
JPvdMerwe,

1
Ho pensato che la gente qui avrebbe voluto provare qualcosa di un po 'più impegnativo.
Keith Randall,

2
@SimpleCoder: Suppongo monospace
JPvdMerwe

Risposte:


5

Ecco il mio codice, 494 caratteri in 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.