이번 문제는 다익스트라 알고리즘을 통해 해결하였다. 그래프는 인접 행렬 방식으로 저장하였고 4가지 방향으로 너비우선탐색을 진행하며 방문 처리를 진행하였고 다익스트라 알고리즘을 통해 최소 비용을 구하였다.
results[0][0]
을 graph[0][0]
로 갱신한다.(graph[0][0], 0, 0)
을 넣는다.visited[y][x]
를 True로 갱신한다.results[y][x]
보다 클 경우, 다음 반복으로 넘긴다.y+dy[i]
를 저장한다.x+dx[i]
를 저장한다.visited[ny][nx]
가 False일 경우,cost+graph[ny][nx]
를 저장한다.results[ny][nx]
가 nxt_cost보다 클 경우,results[ny][nx]
를 nxt_cost로 갱신한다.(nxt_cost, ny, nx)
를 넣는다.Problem %(time): %(results[n-1][n-1]
을 출력한다.import heapq
import sys
time=0
while True:
n=int(input())
if n==0:
break
graph=[]
for _ in range(n):
graph.append(list(map(int, input().split())))
dy=[0, 0, -1, 1]
dx=[-1, 1, 0, 0]
INF=sys.maxsize
visited=[[False]*n for _ in range(n)]
results=[[INF]*n for _ in range(n)]
results[0][0]=graph[0][0]
q=[]
heapq.heappush(q, (graph[0][0], 0, 0))
while q:
cost, y, x=heapq.heappop(q)
visited[y][x]=True
if cost>results[y][x]:
continue
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if ny>=0 and nx>=0 and ny<n and nx<n and not visited[ny][nx]:
nxt_cost=cost+graph[ny][nx]
if results[ny][nx]>nxt_cost:
results[ny][nx]=nxt_cost
heapq.heappush(q, (nxt_cost, ny, nx))
time+=1
print('Problem %d: %d' %(time, results[n-1][n-1]))