문제
N×M크기의 배열로 표현되는 미로가 있다.
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
해결 방법
- dfs나 bfs를 사용하는 문제
- 노드가 아닌 이차원 배열로 주어지므로 미로와 방문처리는 이차원 배열로 선언한다.
- 상하좌우를 탐색할 배열을 생성한다.
- bfs를 할 때 상하좌우도 탐색하여 아직 방문하지 않았고 미로의 해당 위치가 1이면 그 위치에 방문하고 map의 그 위치에 +1을 한다.
- 지금 위치의 경로의 수는 이전 경로의 수에 +1을 하면 구할 수 있기 때문이다.
- 이 경로의 수는 항상 최소다.
- 도착위치의 값을 출력한다.
코드
// 미로 탐색
public class Week08_2178 {
static int w;
static int h;
static int map[][];
static boolean[][] visited;
static int[] dx = {0, -1, 0, 1}; // 상좌하우
static int[] dy = {-1, 0, 1, 0};
public static void main(String[] args) throws IOException {
input();
bfs();
System.out.println(map[h - 1][w - 1]);
}
private static void bfs() {
visited[0][0] = true;
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{0, 0});
while (!queue.isEmpty()) {
int[] temps = queue.poll();
for (int i = 0; i < 4; i++) {
int newH = temps[0] + dy[i];
int newW = temps[1] + dx[i];
if (newH >= 0 && newW >= 0 && newH < h && newW < w) {
if (!visited[newH][newW] && map[newH][newW] == 1) {
queue.add(new int[]{newH, newW});
map[newH][newW] = map[temps[0]][temps[1]] + 1; // 이전 출발지점 + 1을 해서 map의 각 자리에 거리 계산
visited[newH][newW] = true;
}
}
}
}
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
h = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
map = new int[h][w];
visited = new boolean[h][w];
for (int i = 0; i < h; i++) {
String[] temp = br.readLine().split("");
for (int j = 0; j < w; j++) {
map[i][j] = Integer.parseInt(temp[j]);
}
}
}
}
'algorithm' 카테고리의 다른 글
| [BOJ] 4963. 섬의 개수 (0) | 2022.12.11 |
|---|---|
| [BOJ] 5567. 결혼식 (0) | 2022.12.11 |
| [BOJ] 1303. 전쟁 - 전투 (0) | 2022.12.11 |
| [BOJ] 2606. 바이러스 (0) | 2022.12.11 |
| [BOJ] 1743. 음식물 피하기 (1) | 2022.12.09 |