본문 바로가기
Algorithm/Baekjoon

Baekjoon 2178 미로 탐색 JAVA

by Hunveloper 2022. 2. 7.
728x90
 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

문제

N×M크기의 배열로 표현되는 미로가 있다.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

입력

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

풀이

기본적인 BFS 문제이다.

38번째 줄에서 이동하는 부분을 바로 false로 지정해주는데 이렇게 하지 않으면 만약에 모든 경로가 이동 가능할때 중복되어 동시에 탐색하는 부분이 생기기 때문에 메모리 초과 오류가 생기게 된다. 

코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(), m = sc.nextInt();
		boolean[][] map = new boolean[n + 2][m + 2];
		Queue<Integer> qx = new LinkedList<>();
		Queue<Integer> qy = new LinkedList<>();
		Queue<Integer> cnt = new LinkedList<>();
		sc.nextLine();
		for (int i = 1; i <= n; i++) {
			String s = sc.nextLine();
			for (int j = 1; j <= m; j++) {
				map[i][j] = s.charAt(j - 1) == '1' ? true : false;
			}
		}
		sc.close();
		qx.add(1);
		qy.add(1);
		cnt.add(1);
		int[] dx = { -1, 1, 0, 0 }, dy = { 0, 0, -1, 1 };
		while (qx.size() > 0) {
			int x = qx.poll(), y = qy.poll(), c = cnt.poll();
			map[x][y] = false;
			if (x == n && y == m) {
				System.out.println(c);
				break;
			}
			for (int i = 0; i < 4; i++) {
				if (map[x + dx[i]][y + dy[i]]) {
					qx.add(x + dx[i]);
					qy.add(y + dy[i]);
					cnt.add(c + 1);
					map[x+dx[i]][y+dy[i]]=false;
				}
			}
		}
	}
}
728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 11399 ATM JAVA  (0) 2022.02.07
Baekjoon 2606 바이러스 JAVA  (0) 2022.02.07
Baekjoon 2164 카드2 JAVA  (0) 2022.02.07
Baekjoon 11866 요세푸스 문제 0 JAVA  (0) 2022.02.06
Baekjoon 14500 테트로미노 JAVA  (0) 2022.02.05

댓글