미로찾기


백준 2178: 미로찾기

문제보기
Alt text

풀이

BFS를 이용
(N, M) 도착지점에 오면 끝내야 함을 주의
-> 먼저 도착한 것이 최소의 칸 수

소스코드

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

public class Main {
	static class Node {
		int r, c, cnt;

		Node(int r, int c, int cnt) {
			this.r = r;
			this.c = c;
			this.cnt = cnt;
		}

		@Override
		public String toString() {
			return "Node [r=" + r + ", c=" + c + ", cnt=" + cnt + "]";
		}

	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		int[][] map = new int[N][M]; // 미로배열
		for (int i = 0; i < N; i++) {
			String str = sc.next();
			for (int j = 0; j < M; j++) {
				Character ch = str.charAt(j);
				map[i][j] = Integer.parseInt(String.valueOf(ch));
			}
		}
		int[] dr = { -1, 1, 0, 0 }; // 행의 상하좌우
		int[] dc = { 0, 0, -1, 1 }; // 열의 상하좌우
		boolean[][] visited = new boolean[N][M];
		Queue<Node> queue = new LinkedList<>();
		queue.add(new Node(0, 0, 1));
		visited[0][0] = true;
		while (!queue.isEmpty()) {
			Node node = queue.poll();
			int r = node.r;
			int c = node.c;
			int cnt = node.cnt;
			
			//(N,M)위치에 도달한다면 끝
			if(r==N-1 && c==M-1) {
				System.out.println(cnt);
				break;
			}
			
			for (int d = 0; d < 4; d++) {
				int nr = r + dr[d];
				int nc = c + dc[d];

				if (nr >= 0 && nr < N && nc < M && nc >= 0 && !visited[nr][nc]) {
					if (map[nr][nc] == 1) {
						queue.add(new Node(nr, nc, cnt + 1));
						visited[nr][nc] = true;
					}
				}
			}
		}
	}
}