파이썬, 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,000
64 비트 컴퓨터 의 모든 숫자 목록 은 ~ 800Mb의 메모리입니다.
목록 색인은 숫자를 나타내며 값은 허용 된 구조 단계에서 1과의 거리를 나타냅니다.
- "0 단계에 도달 할 수 있음"을 의미하는 list [1] = 0을 설정하십시오.
- 0 단계에 도달 목록의 모든 번호 (예에 대한
1
)
- 1 단계에서 도달 가능한 숫자 +1, 숫자 -1, 숫자 * 2, 숫자 * 3 설정
- 리스트에있는 모든 수의 어느 한 단계에서 (예를 연결할
0,2,2,3
)
- 2 단계로 도달 가능한 숫자 +1, 숫자 -1, 숫자 * 2, 숫자 * 3 설정
- ... 모든 목록 색인에 도달 할 때까지
런타임은 10 분이 조금 넘습니다. * 아헴 *.
코드 주석
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 이동 또는 이하의 선장에 대한 경로가 있습니다.
- 한 방만 30 칸 떨어져 있습니다-방 72,559,411-29 개 떨어진 244 개의 방이 있습니다.
- 최대 사례의 경우 런타임 특성이 끔찍할 수 있지만 질문 의견 중 하나는 " @Geobits 5 분 안에 20000 테스트 사례에 가장 짧은 방법을 찾아야하는 모든 프로그램 "이며 <6 초 안에 1-20,001을 테스트합니다.