破坏火车使其迟到[关闭]


15

“我想去阿拉伯市场去买一份我爱上的礼物。但是,如果我来得太晚,所有的商店都会关门,我将无法买到任何东西。你能帮忙吗?我吗?

目标:在所有商店关门之前从北里士满街(North Richmond Street)带男孩去阿拉比(Araby)。
实际目标:确保男孩在商店关门之前没有到达阿拉比。

您的程序将采用以下格式输入:

<time> <map>

哪里

  • <time>是男孩可以旅行的最长时间,以分钟为单位。它是一个正整数。
  • <map> 是火车可以走的路线图。

这是图形格式的工作方式:

  • 每个语句以分号结尾。
  • 映射中的节点(代表开关)使用单个小写字母表示。
  • 节点之间的路径用语法表示a,X,b,其中X是表示路径权重的整数。路径的权重是火车经过这两个节点所花费的时间(以分钟为单位)。
  • 阿拉伯文(Araby)代表a,北里士满街(North Richmond Street)代表n
  • 所有路径都是双向的。

例如,此图(假设路径是双向的):

图形
图片来自Artyom Kalinin,来自Wikimedia Commons。根据CC BY-SA 3.0许可使用。

将在图形符号中记录为:

a,4,b;a,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,f;

请注意,此输入没有n,因此是无效的输入。如果输入无效,您的程序可能会执行任何操作。

这是一个示例输入:

21 n,4,b;n,2,c;b,5,c;b,10,d;c,3,e;e,4,d;d,11,a;

(这是与上面的图片相同的图形,anf代替了a)。

男孩必须从取得na21分钟内。如果他走这条路线n-> c-> e-> d-> a,他会在20分钟内到达那里,这是及时的。我们可以将该路由表示为以逗号分隔的节点列表:

n,c,e,d,a

另一方面,路线n-> b-> c-> e-> d-> a将导致男孩花27分钟,这不是及时的。我们可以这样表示该路线:

n,b,c,e,d,a

另一个可能导致男孩无法及时赶到的方法是:

n,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,b,c,e,d,a

您的程序应该如上所述接受输入,乍一看似乎输出的一条路线将使男孩及时完成,但实际上输出一条导致该男孩无法及时完成的​​路线。对于任何给定的输入,总会有一条没有回溯的路线,这会导致男孩无法及时到达目的地。

这是一场不受欢迎的人气竞赛,因此得票最多的作品将获胜。投票是因为隐藏虫子的技巧而获得的-越不明显,它就越好。

这是一些示例图,可用来测试您的程序。

输入:

12 a,2,c;a,2,e;b,5,c;b,4,d;b,11,e;d,7,n;e,4,n;

视觉表示(此视觉表示仅是为了清楚起见,并不构成挑战的一部分):

输入1

一个可能的输出:

n,d,b,e,a

输入:

10 a,8,b;a,12,d;b,1,n;d,11,n;a,1,n;

这是图形的可视图像:

输入2

一个可能的输出:

n,d,a

 


我们可以编写一个函数(代替独立程序)吗?
golfer9338

@ golfer9338是的。如果可能的话,我更喜欢一个程序,但是如果不熟练的部分依靠它作为一个函数,那么就允许一个函数。
苦艾酒

我问是因为我打算用Javascript做到这一点。
golfer9338

3
真正的问题是,为什么我们要除掉这个深受爱戴的男孩?也许他侮辱了我们的家人?我们自己是否有针对他的感情的设计?我们必须知道!
Claudiu 2014年

3
我投票结束这个问题是因为题外话,因为在这种情况下,处理不足的挑战就不成问题了
Rohan Jhunjhunwala

Answers:


2

Python 3(不是2)

编辑:我会在早上取消高尔夫,哎呀。

这是完全正常的A星级搜索。对?权利?似乎适用于所有测试用例。

def a(b,c,d):
    e,f,g=[],{},{}
    f[c]=0
    while f:
        h=sorted(f.keys(),key=lambda z:-f[z],reverse=True)[-1]
        if h==d:break
        e.append(h)
        for z in b[h]:
            if z in e:continue
            if z in f and f[z]>f[h]+b[z][h]:continue
            g[z]=h
            f[z]=f[h]+b[z][h]
        del f[h]
    i=[]
    j=d
    q=0
    while j!=c:
        i.append(j)
        q+=b[j][g[j]]
        j=g[j]
    return q,(i+[c])[::-1]
t,q=input().split(" ")
t=int(t)
q=q[:-1]
q=[i.split(",")for i in q.split(";")]
g={a:{}for a in __import__("functools").reduce(lambda zz,zy:zz+zy,[[v[0],v[2]]for v in q])}
for l in q:g[l[0]][l[2]]=g[l[2]][l[0]]=int(l[1])

r=a(g,'n','a')
print("time-good: %d, time-ours: %d" % (t, r[0]))
print("path: %s" % " -> ".join(r[1]))
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.