늦게 운행하기 위해 열차를 방해하다


15

"아라비 바자회에 가서 사랑에 빠진 사람에게 선물을 사러 가고 싶습니다. 그러나 너무 늦게 도착하면 모든 상점이 문을 닫고 아무것도 살 수 없습니다. 도와 드릴까요? 나? "

목표 : 모든 매장이 문을 닫기 전에 North Richmond Street에서 소년을 아라비에게 가져 가십시오.
실제 목표 : 매장이 문을 닫기 전에 소년이 아라비에 도착하지 않도록하십시오.

프로그램은 다음 형식으로 입력을받습니다.

<time> <map>

어디

  • <time>소년이 여행을 보낼 수있는 최대 시간 (분)입니다. 양의 정수입니다.
  • <map> 열차가 이용할 수있는 경로의 그래프입니다.

그래프 형식은 다음과 같습니다.

  • 각 문장은 세미콜론으로 끝납니다.
  • 맵의 노드 (스위치를 나타냄)는 단일 소문자를 사용하여 표시됩니다.
  • 노드 사이의 경로는 구문으로 표시됩니다. a,X,b여기서 X경로의 가중치를 나타내는 정수입니다. 경로의 무게는 기차가 두 노드를 통과하는 데 걸리는 시간 (분)입니다.
  • Araby는로 표시 a되고 North Richmond Street는로 표시됩니다 n.
  • 모든 경로는 양방향입니다.

예를 들어,이 그래프 (경로가 양방향 인 척) :

그래프
Wikimedia Commons를 통한 Artyom Kalinin의 이미지 . 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;

(이는 위에서 이미지처럼 동일한 그래프의 a대체 nf교체 a).

소년에서 받아야 na21분 내. 그가 n-> c-> e-> d-> 경로를 타면 a20 분 안에 도착합니다. 라우트를 쉼표로 구분 된 노드 목록으로 나타낼 수 있습니다.

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

3
나는 불공정 문제이기 때문에이 광경에 주제와 주제에서 벗어난로이 질문을 닫으 투표 해요
로한 Jhunjhunwala을

답변:


2

파이썬 3 (2 아님)

편집 : 나는 아침에 이것을 풀다.

완벽하게 정상적인 A-star 검색입니다. 권리? Riiiiiiight? 모든 테스트 사례에서 작동하는 것 같습니다.

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]))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.