- 그래프 탐색
- BFS
- BFS, 큐를 활용한 풀이
- 파이썬의 내장 자료구조인 deque를 활용해서 순간이동 시
- 관리할 리스트의 크기를 시작과 목표지점의 차이의 2배로 설정 (곱하기 2 연산 때문)
관리할 리스트 (dp)를 생성 ( dp[n]
은 시작 지점에서 n까지의 최단 거리를 뜻함 )
방문하지 않은 곳은 -1로 설정
시작 지점 dp[start]
을 0으로 설정
목표 지점 dp[finish]
초기값을 abs(start - finish) -> start와 finish의 차이로 설정
# 그림
# 그림
from collections import deque
start, finish = map(int, input().split())
# -1 -> 방문을 한 번도 안함
# n >= 0 -> finish까지 걸리는 시간
dp = [-1] * (max(start, finish) * 2)
dp[start] = 0
dp[finish] = abs(start - finish)
queue = deque([start])
while queue:
n = queue.popleft()
if dp[n] >= dp[finish]:
continue
if n < finish:
if dp[n * 2] == -1 or dp[n] < dp[n * 2]:
dp[n * 2] = dp[n]
queue.appendleft(n * 2)
if dp[n + 1] == -1 or dp[n] + 1 < dp[n + 1]:
dp[n + 1] = dp[n] + 1
queue.append(n + 1)
if n != 0 and (dp[n - 1] == -1 or dp[n] + 1 < dp[n - 1]):
dp[n - 1] = dp[n] + 1
queue.append(n - 1)
elif n > finish:
if dp[n - 1] == -1 or dp[n] + 1 < dp[n - 1]:
dp[n - 1] = dp[n] + 1
queue.append(n - 1)
print(dp[finish])
res = []
for n in range(N):
for m in range(M):
if not visited[n][m] and picture[n][m] == 1:
res.append(dfs(1, n, m))
if len(res) == 0:
print(0)
print(0)
else:
print(len(res))
print(max(res))