import sys, heapq
input = sys.stdin.readline
INF = int(1e9) # 초기 무한 설정용 상수
prob = 0 # 테스트 케이스 문제 번호
dir = [(-1, 0), (0, 1), (1, 0), (0, -1)] # 좌, 상, 우, 하
# 다익스트라 함수
def dijkstra(g, x, y, sp, n):
q = [] # 우선순위 큐로 쓸거임
heapq.heappush(q, (g[0][0], x, y)) # 초기 비용 우선순위로 비용과 값으로 x, y좌표 푸쉬
sp[0][0] = g[0][0] # 테이블에 시작 노드 초기값 설정
while q: # 큐가 빌 때까지 반복 수행
d, x, y = heapq.heappop(q) # 최소 비용 하나 가져와 봄
if sp[x][y] < d: # 큐에 값이 테이블 보다 더 크면 이미 계산된 것이므로 패스
continue
for rx, ry in dir: # 노드의 4방향 탐색
rx += x
ry += y
if rx >= 0 and rx < n and ry >= 0 and ry < n: # 범위를 벗어나지 않았다면
cost = sp[x][y] + g[rx][ry] # 현재 값에 다음 값을 더해 비용 계산
if cost < sp[rx][ry]: # 최저 값이면
sp[rx][ry] = cost # 테이블 갱신
heapq.heappush(q, (cost, rx, ry)) # 큐 삽입
return sp
while True:
# 문제 번호
prob += 1
# 크기 입력
n = int(input())
# 0 입력 시 종료
if n == 0:
break
# 우선순위 테이블
sp = [[INF] * n for _ in range(n)]
# 그래프 입력
g = []
for i in range(n):
g.append(list(map(int, input().split())))
# 다익스트라 결과 최단거리 출력
print("Problem %d: %d" % (prob, dijkstra(g, 0, 0, sp, n)[n-1][n-1]))
문제풀이