https://www.acmicpc.net/problem/4485
간선의 가중치를 최소로 하여 이동하는 다익스트라 문제입니다.
저는 이를 BFS+메모이제이션을 활용하여 풀어봤습니다.
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
n = Integer.parseInt(br.readLine());
if (n == 0) break;
map = new int[n][n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
dist = new int[n][n];
for (int i = 0; i < n; i++) Arrays.fill(dist[i], INF);
n: 한 변의 길이n == 0이면 종료map: 지도의 정보dist: 잃은 루피의 정보를 담을 배열 private static void bfs() {
Queue<int[]> queue = new ArrayDeque<>();
queue.add(new int[] { 0, 0 });
dist[0][0] = map[0][0];
while (!queue.isEmpty()) {
int[] cur = queue.poll();
int r = cur[0], c = cur[1];
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nr >= n || nc < 0 || nc >= n) continue;
int tmp = dist[r][c] + map[nr][nc];
if (dist[nr][nc] > tmp) {
dist[nr][nc] = tmp;
queue.add(new int[] { nr, nc });
}
}
}
}
dist에 시작점 값 삽입 bfs();
sb.append("Problem ").append(++t).append(": ").append(dist[n-1][n-1]).append('\n');
}
System.out.println(sb.toString());
dist[n-1][n-1])값 출력import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int n;
static int[][] map, dist;
static int t = 0;
static final int[] dr = { -1, 1, 0, 0 };
static final int[] dc = { 0, 0, -1, 1 };
static final int INF = 1_000_000_000;
private static void bfs() {
Queue<int[]> queue = new ArrayDeque<>();
queue.add(new int[] { 0, 0 });
dist[0][0] = map[0][0];
while (!queue.isEmpty()) {
int[] cur = queue.poll();
int r = cur[0], c = cur[1];
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nr >= n || nc < 0 || nc >= n) continue;
int tmp = dist[r][c] + map[nr][nc];
if (dist[nr][nc] > tmp) {
dist[nr][nc] = tmp;
queue.add(new int[] { nr, nc });
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
n = Integer.parseInt(br.readLine());
if (n == 0) break;
map = new int[n][n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
dist = new int[n][n];
for (int i = 0; i < n; i++) Arrays.fill(dist[i], INF);
bfs();
sb.append("Problem ").append(++t).append(": ").append(dist[n-1][n-1]).append('\n');
}
System.out.println(sb.toString());
}
}