링크
import java.util.*;
class Solution {
public int nearestExit(char[][] maze, int[] entrance) {
int result = -1;
Queue<Route> queue = new LinkedList<>();
int m = maze.length;
int n = maze[0].length;
int[][] visited = new int[m][n];
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
visited[i][j] = Integer.MAX_VALUE;
}
}
queue.add(new Route(0, entrance[0], entrance[1]));
visited[entrance[0]][entrance[1]] = 0;
while(!queue.isEmpty()) {
Route r = queue.poll();
if (!(r.x == entrance[0] && r.y == entrance[1]) && (r.x == 0 || r.y == 0 || r.x == m - 1 || r.y == n - 1)) {
result = r.route;
break;
}
if (r.x + 1 < m && maze[r.x + 1][r.y] == '.' && visited[r.x + 1][r.y] > r.route + 1) {
visited[r.x + 1][r.y] = r.route + 1;
queue.add(new Route(r.route + 1, r.x + 1, r.y));
}
if (r.x - 1 > -1 && maze[r.x - 1][r.y] == '.' && visited[r.x - 1][r.y] > r.route + 1) {
visited[r.x - 1][r.y] = r.route + 1;
queue.add(new Route(r.route + 1, r.x - 1, r.y));
}
if (r.y + 1 < n && maze[r.x][r.y + 1] == '.' && visited[r.x][r.y + 1] > r.route + 1) {
visited[r.x][r.y + 1] = r.route + 1;
queue.add(new Route(r.route + 1, r.x, r.y + 1));
}
if (r.y - 1 > -1 && maze[r.x][r.y - 1] == '.' && visited[r.x][r.y - 1] > r.route + 1) {
visited[r.x][r.y - 1] = r.route + 1;
queue.add(new Route(r.route + 1, r.x, r.y - 1));
}
}
return result;
}
class Route {
public int route;
public int x;
public int y;
public Route(int route, int x, int y) {
this.route = route;
this.x = x;
this.y = y;
}
public String toString() {
return "route: " + route + ", x: " + x + ", y: " + y;
}
}
}