알고리즘/그래프 이론
[백준 2178] 미로 탐색 Java 풀이
빠르게 핵심만
2024. 4. 29. 00:58
https://www.acmicpc.net/problem/2178
접근
(1, 1)에서 출발하여 (n, m) 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하기 위해서는 BFS를 이용하여 문제를 해결할 수 있습니다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
class Position {
int r, c;
Position(int r, int c) {
this.r = r;
this.c = c;
}
}
public class Main {
static int n, m;
static int[][] maze;
// 상, 하, 좌, 우
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력 처리
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
maze = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
char[] input = br.readLine().toCharArray();
for (int j = 1; j <= m; j++) {
maze[i][j] = input[j - 1] - '0';
}
}
// 최소의 칸 수를 구하기 위해서 bfs 수행
bfs();
// 결과 출력
System.out.println(maze[n][m]);
}
static void bfs() {
Queue<Position> bfsQ = new ArrayDeque<>();
bfsQ.offer(new Position(1, 1));
while (!bfsQ.isEmpty()) {
Position curr = bfsQ.poll();
for (int dir = 0; dir < 4; dir++) {
int nr = curr.r + dr[dir];
int nc = curr.c + dc[dir];
if (inRange(nr, nc) && maze[nr][nc] == 1) {
bfsQ.offer(new Position(nr, nc));
maze[nr][nc] = maze[curr.r][curr.c] + 1;
}
}
}
}
static boolean inRange(int r, int c) {
return 1 <= r && r <= n && 1 <= c && c <= m;
}
}