์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ = bfs ํ์ด
๋ฌด์ํ๊ฒ ๋ชจ๋ ์ด๋ ๋ฃจํธ๋ค์ ํ์ ๊ฐ์ด ์ ์ฅํ๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ํฐ์ง๋ ์ ์ฅํ๋ค ์๊ฐ์ด ํฐ์ง๋ ๋ ์ค ํ๋์ผ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋๋ฐ ์๊ฐ์ด ํฐ์ก๋ค
# ์จ๋ฐ๊ผญ์ง 4
def bfs(N, K):
queue = [(N, [N])]
visited[N] = 1
while queue:
s, route = queue.pop(0)
# print(route, s, K)
if s == K:
return route
t = visited[s]
if -1<s-1 and visited[s-1] == -1:
queue.append((s-1, route+[s-1]))
visited[s-1] = t+1
if s+1<100001 and visited[s+1] == -1:
queue.append((s+1, route+[s+1]))
visited[s+1] = t+1
if s*2<100001 and visited[s*2] == -1:
queue.append((s*2, route+[2*s]))
visited[s*2] = t+1
N, K = map(int, input().split())
visited = [-1]*100001
route = bfs(N, K)
print(visited[K]-1)
print(*route)
๊ทผ๋ฐ ์ ์ด์ ์๊ฐ์ด ์ ํฐ์ ธ๋ ์์ ํ์ด๋ ํ๋ฆด ์ ๋ฐ์ ์์๋ค.
์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํด์ ํ์ด๋ ๊ณ์ ์๊ฐ์ด๊ณผ๊ฐ ๋๊ธธ๋ ์ด์ ๋ฅผ ์ฐพ์๋ดค๋๋
์ฒ์๋ถํฐ visited๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ฉด ์ ๋๋๊ฑฐ์๋ค.
๋ธ๋ก๊ทธ์ ํ์ด๋ ์์ฝํ๋ฉด
- visited ๋ฐฐ์ด์๋ ์ง์ ์์น๋ฅผ ๊ธฐ๋กํ๋ค
- ํ์๋ ์ด๋ํ๋ ์๊ฐ์ ๊ธฐ๋กํ๋ค
์ธ๋ฐ, ์์ ๋ด ํ์ด์ ์์ ๋ฐ๋๋ค. ๋๋ visited๋ฐฐ์ด์ ์๊ฐ์, ํ์ ์ด๋ ์์น๋ฅผ ๊ธฐ๋กํ๋๋ฐ ํ์ ์๊ฐ์ ๊ธฐ๋กํ๋ฉด ์๊ฐ์ ๊ณ์ ์ซ์ํ๋๋ก ๊ธฐ๋ก๋์ง๋ง ์ด๋ ์์น๋ฅผ ๊ธฐ๋กํ๋ฉด ๋ฆฌ์คํธ๊ฐ ๋ฌดํ๋๋ก ๋์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค.
# 168ms
from collections import deque
N, K = map(int, input().split())
path, visited = [], [-1]*100001
def bfs(start, target):
queue = deque()
queue.append((start, 0))
# visited ๋ฐฐ์ด์ ์ด์ ์ ์์น๋ฅผ ๊ธฐ๋ก
# queue์ ์ด๋ํ ์๊ฐ(cur_time) ๊ธฐ๋ก
# target์ ๋ฐ๊ฒฌํ๋ฉด ์ด์ ์ผ๋ก ํ์นธ์ฉ ์ด๋ํ๋ค๊ฐ
# ์ต์ด ์ง์ (visited๊ฐ start์ธ ๊ณณ)์ ๋ง๋๋ฉด ์ข
๋ฃ
visited[start] = start
while queue:
now, move_time = queue.popleft()
if now == target:
cur = now
# visited[cur]์๋ cur์ ์ค๊ธฐ ์ง์ ์ ์์น๊ฐ ๊ธฐ๋ก๋์ด ์์
# ์ถ๋ฐ์ ์ ๋์ฐฉํ๋ฉด ์ถ๋ฐ์ ์ path์ ์ถ๊ฐ๋์ง ์๊ณ ์ข
๋ฃ๋๋ฏ๋ก ๋ฐ๋ก ์ถ๊ฐํด์ค์ผ ํจ
while cur != start:
path.append(cur)
cur = visited[cur]
path.append(start)
return move_time
if now+1 < 100001 and visited[now+1] == -1:
visited[now+1] = now
queue.append((now+1, move_time+1))
if now-1 > -1 and visited[now-1] == -1:
visited[now-1] = now
queue.append((now-1, move_time+1))
if now*2 < 100001 and visited[2*now] == -1:
visited[2*now] = now
queue.append((2*now, move_time+1))
print(bfs(N, K))
print(*path[::-1])