import heapq # 방향 벡터 dy = [1, -1, 0, 0] dx = [0, 0, 1, -1] def dijkstra(): queue = [[rupee[0][0], 0, 0]] # 탐험 할 곳 담아둘 리스트 # 시작지점 루피, y좌표, x좌표 넣기 visited[0][0] = rupee[0][0] # 시작지점 루피 while queue: d, y, x = heapq.heappop(queue) # 현재까지 잃은 루피, 현재 좌표 꺼내기 if y == n-1 and x == n-1: # 동굴 출구까지 왔다면 현재까지 잃은 루피 출력 print(f'Problem {tc}: {d}') return if visited[y][x] < d: # 현재까지 잃은 루피가 저장되어 있는 루피보다 크다면 패스 continue for i in range(4): ny = y + dy[i] nx = x + dx[i] if 0 <= ny < n and 0 <= nx < n: # 다음 갈 곳이 범위 내에 있다면 nd = d + rupee[ny][nx] # 현재까지 잃은 루피 + 다음 위치에서 잃을 루피 if nd < visited[ny][nx]: # 그 루피가 저장되어 있는 루피보다 적다면 갱신 visited[ny][nx] = nd heapq.heappush(queue, [nd, ny, nx]) # 가보기 tc = 1 while True: n = int(input()) # 동굴의 크기 if n == 0: # 0 입력이 주어지면 전체 입력 종료 break rupee = [list(map(int, input().split())) for _ in range(n)] # 도둑루피 visited = [[float('inf') for _ in range(n)] for _ in range(n)] dijkstra() tc += 1
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python] 20309. 트리플 소트 (0) | 2022.01.14 |
---|---|
[Python] 소가 길을 건너간 이유 5 (0) | 2022.01.14 |
[Python] 9663. N-Queen (0) | 2022.01.14 |
[Python] 2098. 외판원 순회 (0) | 2022.01.12 |
[Python] 1311. 할 일 정하기 1 (0) | 2022.01.12 |