bfs 알고리즘 문제이다.
(0,0)
부터 시작해 (N-1,M-1)
까지 가는 최단 거리를 구해야 한다.
0,0
부터 시작한다.int[] xMove = {0, 0, -1, 1}
int[] yMove = {-1, 1, 0, 0}
을 현재 x, y
에 차례대로 더하면서 상하좌우(인접한) 칸을 탐색한다.add
한다.1
로 초기화 되어 있다.0,0
칸에서 만약에 0,1
칸에 갈 수 있다고 한다면0,1
칸의 숫자 1
을 왔던 칸의 숫자에 + 1
한 숫자로 바꾼다.+ 1
해주는 것이다.[N-1][M-1]
칸에는 0,0
칸에서의 거리가 입력 될 것이다.여기서 중요한 점이 나중에 미로의 거리의 값에 다른 경우의 수가 들어갈 수 있다고 생각할 수 있다.
이 경우 먼저 가장 빠른 거리의 수가 입력되고 나중에 그 칸에 더 긴 거리의 수가 입력되는 경우이다.
이것을 방지하기 위해 if (maze[newX][newY] != 0 && !visited[newX][newY])
이 조건문을 사용한다.
이미 더 가까운 거리의 수의 경로가 방문했기 때문에 더 느린 경우는 방문하지 못한다!!
또한, x, y
좌표 값을 큐에서 관리하기 위해 spot
이라는 새로운 클래스를 만들어서 사용했다.
public class bj2178 {
public static int M, N, count;
public static int[][] maze;
public static boolean[][] visited;
static int[] xMove = {0, 0, -1, 1};
static int[] yMove = {-1, 1, 0, 0};
public static void main(String[] args) throws Exception {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
N = Integer.parseInt(split[0]);
M = Integer.parseInt(split[1]);
visited = new boolean[N][M];
maze = new int[N][M];
count = 0;
for (int i = 0; i < N; i++) {
String line = br.readLine();
char[] charArray = line.toCharArray();
for (int j = 0; j < M; j++) {
maze[i][j] = Integer.parseInt(String.valueOf(charArray[j]));
}
}
bfs(0, 0);
bw.write(maze[N - 1][M - 1] + "\n");
bw.flush();
bw.close();
br.close();
}
private static void bfs(int x, int y) {
Queue<spot> queue = new LinkedList<>();
queue.add(new spot(x, y));
visited[x][y] = true;
while (!queue.isEmpty()) {
spot start = queue.poll();
for (int i = 0; i < 4; i++) {
int newX = start.x + xMove[i];
int newY = start.y + yMove[i];
if (newX >= 0 && newX < N) {
if (newY >= 0 && newY < M) {
if (maze[newX][newY] != 0 && !visited[newX][newY]) {
queue.add(new spot(newX, newY));
maze[newX][newY] = maze[start.x][start.y] + 1;
visited[newX][newY] = true;
}
}
}
}
}
}
static class spot {
int x;
int y;
spot(int x, int y) {
this.x = x;
this.y = y;
}
}
}