๊ฐ๋ก ์ด๋์ ๊ฒฝ์ฐ 0์ด ์๋๋ฉด ๋ชป๊ฐ๊ฒ ๊ตฌํํ๋ฉด ๋๊ฒ ์ง๋ง, ์ธ๋ก ์ด๋์ ๊ฒฝ์ฐ 0์ด์ด๋ 1์ด ๋์ฌ ๋ ๊น์ง ๋๊น์ง ๊ฐ๋ด์ผํ๋ค.
heapq๋ฅผ ์ฌ์ฉํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
๊ฐ๋ก ์ด๋ (์ข์ฐ)์ ๊ฒฝ์ฐ 1์ด๋ฉด ๊ฐ๊ณ , 0์ด๋ฉด ๊ฐ์ง ์๋๋ค.
์ธ๋ก ์ด๋์ ๊ฒฝ์ฐ 1์ด๋ฉด ๊ฐ๊ณ , 0์ด๋ผ๋ฉด 1์ด ๋์ฌ ๋ ๊น์ง ๊ณ์ ํ์์ ์ด์ด๊ฐ๋ค.
1์ ๋ง๋ฌ๋ค๋ฉด difficulty๋ฅผ ๋น๊ตํด์ ์ ๋ฐ์ดํธ ํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๊ณ ์ ๋ฐ์ดํธ ๋์๋ค๋ฉด queue์ ์ฝ์ ํ๋ค.
์ ์ ์ : O(H * W)
๊ฐ ์ ์ ์์ ๊ฐ๋ก ์ด๋O(1), ์ธ๋ก ์ด๋ ์ ๊ฐ์ ์ด์ ๋๊น์ง ํ๋ ๊ฒฝ์ฐ ์ต์
O(H)
๋ฐ๋ผ์ ํ ์ ์ ๋น ๊ฐ์ ์๋ O(H), ์ ์ฒด ๊ฐ์ ์๋ O(N ยท H) = O(Hยฒ ยท W)
๋ค์ต์คํธ๋ผ ์ ์ฒด ๋ณต์ก๋: O(Hยฒ ยท W ยท log(H ยท W))
import heapq
def dijkstra(start_y, start_x):
queue = []
dist[start_y][start_x] = 0
heapq.heappush(queue, (dist[start_y][start_x] ,start_y, start_x))
while queue:
difficulty, sy, sx = heapq.heappop(queue)
if grid[sy][sx] == 3:
return difficulty
if difficulty > dist[sy][sx]: # ์
๋ฐ์ดํธ ํ ํ์๊ฐ ์๋ค๋ฉด
continue
# ๊ฐ๋ก(X์ขํ)์ด๋
for dx in [-1, 1]:
nx = sx + dx
if 0 <= nx < W and grid[sy][nx] in (1, 3): # ์ ํจ ๋ฒ์ ๋ด + ๋ฐ์นจ์ด๋ผ๋ฉด, ๋์ด๋์ ๋ณํ๋ ์๋ค (๊ฐ๋ก ์ด๋ ์์๋)
if dist[sy][nx] > difficulty:
dist[sy][nx] = difficulty
heapq.heappush(queue, (dist[sy][nx], sy, nx))
# ์ธ๋ก(Y์ขํ)์ด๋
for dy in [-1, 1]:
ny = sy + dy
# 1์นธ์ ์ด๋ ์ฑ๊ณตํ๋ค๋ฉด ๋์ด๋๋ 1์ด๋ค. ๋์ด๋ ์
๋ฐ์ดํธ๋ ํ์ฌ ๋์ด๋์ ๋น๊ตํด์ ๋ ํฐ ๋์ด๋๋ก ํด์ผํจ.
if 0 <= ny < H and grid[ny][sx] in (1, 3):
cost = 1
diff = max(cost, difficulty)
if dist[ny][sx] > diff:
dist[ny][sx] = diff
heapq.heappush(queue, (dist[ny][sx], ny, sx))
# ๋น ๊ณต๊ฐ ์ด๋ผ๋ฉด
elif 0 <= ny < H and grid[ny][sx] == 0:
# ํ๋ฝ ์ค์ด์๋ค๋ฉด
if dy == 1:
for k in range(1, H):
k_ny = ny + k
if 0 <= k_ny < H and grid[k_ny][sx] in (1, 3):
cost = abs(k_ny - sy)
diff = max(cost, difficulty)
if dist[k_ny][sx] > diff:
dist[k_ny][sx] = diff
heapq.heappush(queue, (dist[k_ny][sx], k_ny, sx))
break
# ์์น ์ค์ด์๋ค๋ฉด
else:
for k in range(-1, -H, -1):
k_ny = ny + k
if 0 <= k_ny < H and grid[k_ny][sx] in (1, 3):
cost = abs(k_ny - sy)
diff = max(cost, difficulty)
if dist[k_ny][sx] > diff:
dist[k_ny][sx] = diff
heapq.heappush(queue, (dist[k_ny][sx], k_ny, sx))
break
INF = float('inf')
T = int(input())
for tc in range(1, T+1):
W, H = map(int, input().split()) # W๋ ๊ฐ๋ก(X์ขํ), H๋ y์ขํ
grid = [list(map(int, input().split())) for _ in range(H)]
dist = [[INF] * W for _ in range(H)]
ans = 0
found = False
sy = -1
sx = -1
# ์์์ (2 ์ฐพ๊ธฐ)
for y in range(H):
for x in range(W):
if grid[y][x] == 2:
sy, sx = y, x
found = True
break
if found:
break
ans = dijkstra(sy, sx)
print(f"#{tc} {ans}")