图中的最短路径


12

编写程序以绘制图形(从标准输入或文件中选择),并在图形中找到最短路径。

图形使用以下格式指定:

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

所有边缘都是无方向的,并沿8个基本方向之一(即无弯曲)放置。边缘可以选择包含0到9的权重。该权重不会在将边缘连接到节点的最后一个符号上(即,边缘必须至少具有3个符号才能包含权重)。未加权边缘的默认权重为1。

您的代码应计算节点之间的最短路径ST并打印长度和路径,如下所示:

5:SDEFT

最短的正确程序获胜。


1
是否必须解析图形图,或者可以使用自己的格式?格式的一个示例-您的图形可以表示为:(AS0,SD0,SE5,DE3,FE0,FT0如果每个条目的长度为3个字节,则可以省略逗号。)
Thomas O

1
是的,您必须按照我的指定来分析图形。实际上,这是最主要的问题。最短路径部分只是确保您的解析正确。
基思·兰德尔

3
输入格式确实太复杂了,恕我直言,实际上并没有增加太多的问题。
JPvdMerwe 2011年

1
只是以为这里的人们想尝试一些更具挑战性的事情。
基思·兰德尔

2
@SimpleCoder:我假设是等宽的
JPvdMerwe 2011年

Answers:


5

这是我的代码,python中的494个字符:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.