Python、176バイト
n=int(1e8);s,f,L=0,input(),[1,0]+[n]*(n-1)
def h(q):
if 0<=q<=n and L[q]>s:L[q]=s+1
while n in L:
for i,v in enumerate(L):
if v==s:map(h,(i-1,i+1,i*2,i*3))
s+=1
print L[f]
ブルートフォースをずっと。1 to 100,000,00064ビットコンピューター上のすべての数値のリストは、〜800Mbのメモリです。
リストインデックスは数値を表し、値は許可された救助手順の1からの距離を表します。
- 「0ステップで到達可能」を意味するlist [1] = 0を設定します。
- 0ステップで到達可能なリスト内のすべての番号(つまり
1)
- 1ステップで到達可能なnumber + 1、number-1、number * 2、number * 3を設定します
- 1ステップで到達可能なリスト内のすべての番号(つまり
0,2,2,3)
- 2つのステップで到達可能なnumber + 1、number-1、number * 2、number * 3を設定します
- ...など。すべてのリストインデックスに達するまで。
ランタイムは10分を少し超えています。* ahem *。
コードコメント
n=int(1e8) # max input limit.
s=0 # tracks moves from 1 to a given number.
f=input() # user input.
L=[1,0]+[n]*(n-1) # A list where 0 can get to room 1 in 1 step,
# 1 can get to itself in 0 steps,
# all other rooms can get to room 1 in
# max-input-limit steps as a huge upper bound.
def helper(q):
if 0<=q<=n: # Don't exceed the list boundaries.
if L[q]>s: # If we've already got to this room in fewer steps
# don't update it with a longer path.
L[q]=s+1 # Can get between rooms 1 and q in steps+1 actions.
while n in L: # until there are no values still at the
# original huge upper bound
for i,v in enumerate(L):
if v==s: # only pick out list items
# rechable in current s steps,
map(helper,(i-1,i+1,i*2,i*3)) # and set the next ones reachable
# in s+1 steps.
s+=1 # Go through the list again to find
# rooms reachable in s+1 steps
print L[f] # show answer to the user.
その他
- PythonWinで実行する場合、後でインタープリターのリストLにアクセスできます。
- すべての部屋には、30回以内にキャプテンへのパスがあります。
- ルーム72,559,411の1部屋のみが30の移動先で、29の移動先の244の部屋があります。
- 最大のケースではひどいランタイム特性を持っているかもしれませんが、質問コメントの1つは「5分間で20000個のテストケースの最短方法を見つける必要があるすべてのプログラム」で、6秒未満で1-20,001をテストします。