「アラビアバザールに行って、恋に落ちたプレゼントを買いたいと思っています。しかし、到着が遅すぎると、すべての店が閉まってしまい、何も買えなくなります。私?」
目標:すべての店舗が閉鎖される前に、ノースリッチモンドストリートから少年をアラビアに連れて行きます。
実際の目標:店が閉まる前に少年がアラビアに到着しないようにしてください。
プログラムは、次の形式で入力を受け取ります。
<time> <map>
どこ
<time>
少年が旅行に費やすことができる最大時間(分単位)です。正の整数です。<map>
電車が通ることができるルートのグラフです。
グラフの形式は次のとおりです。
- 各ステートメントはセミコロンで終了します。
- マップ内のノード(スイッチを表す)は、単一の小文字を使用して表されます。
- ノード間のパスは、構文
a,X,b
で表されます。ここX
で、はパスの重みを表す整数です。パスの重みは、列車がこれらの2つのノードを通過するのにかかる時間(分単位)です。 - アラビアはで表され
a
、ノースリッチモンドストリートはで表されますn
。 - すべてのパスは双方向です。
たとえば、このグラフ(パスが双方向のふりをします):
ウィキメディア・コモンズ経由の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
置き換えられn
、f
置き換えられたグラフと同じグラフです。a
です)。
少年はから取得する必要がありますn
へのa
21分以内。彼がルートを取る場合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;
視覚的表現(この視覚的表現は明確にするためだけであり、課題の一部ではありません):
可能出力:
n,d,b,e,a
入力:
10 a,8,b;a,12,d;b,1,n;d,11,n;a,1,n;
これがグラフの視覚画像です。
可能出力:
n,d,a