[백준] SW 역량테스트 문제집

구슬 탈출 2

public class Main {
    static int N, M;
    static char[][] board;
    static boolean[][][][] visited;
    static int[] dx = {0, 0, -1, 1};  // 좌우
    static int[] dy = {-1, 1, 0, 0};  // 상하

    static class Node {
        int rx, ry, bx, by, depth;
        Node(int rx, int ry, int bx, int by, int depth) {
            this.rx = rx; this.ry = ry;
            this.bx = bx; this.by = by;
            this.depth = depth;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken());
        board = new char[N][M];
        int rx=0, ry=0, bx=0, by=0;

        for (int i = 0; i < N; i++) {
            board[i] = br.readLine().toCharArray();
            for (int j = 0; j < M; j++) {
                if (board[i][j] == 'R') { ry = i; rx = j; board[i][j] = '.'; }
                if (board[i][j] == 'B') { by = i; bx = j; board[i][j] = '.'; }
            }
        }

        visited = new boolean[N][M][N][M];
        System.out.println(bfs(rx, ry, bx, by));
    }

    static int bfs(int rx, int ry, int bx, int by) {
        Queue<Node> q = new LinkedList<>();
        q.offer(new Node(rx, ry, bx, by, 0));
        visited[ry][rx][by][bx] = true;

        while (!q.isEmpty()) {
            Node cur = q.poll();
            if (cur.depth >= 10) break;

            for (int dir = 0; dir < 4; dir++) {
                int nrx = cur.rx, nry = cur.ry;
                int nbx = cur.bx, nby = cur.by;
                int rc = 0, bc = 0;

                // 파란 구슬부터 이동
                while (board[nby+dy[dir]][nbx+dx[dir]] != '#' &&
                      board[nby][nbx] != 'O') {
                    nby += dy[dir];
                    nbx += dx[dir];
                    bc++;
                }

                // 빨간 구슬 이동
                while (board[nry+dy[dir]][nrx+dx[dir]] != '#' &&
                      board[nry][nrx] != 'O') {
                    nry += dy[dir];
                    nrx += dx[dir];
                    rc++;
                }

                // 파란이 빠지면 실패 패스
                if (board[nby][nbx] == 'O') continue;
                // 빨간만 빠지면 성공
                if (board[nry][nrx] == 'O') return cur.depth + 1;

                // 겹쳤다면…
                if (nrx == nbx && nry == nby) {
                    if (rc > bc) { nrx -= dx[dir]; nry -= dy[dir]; }
                    else { nbx -= dx[dir]; nby -= dy[dir]; }
                }

                if (!visited[nry][nrx][nby][nbx]) {
                    visited[nry][nrx][nby][nbx] = true;
                    q.offer(new Node(nrx, nry, nbx, nby, cur.depth + 1));
                }
            }
        }

        return -1;
    }
}

2048

시험 감독

주사위 굴리기

테트로미노

퇴사

연구소

로봇 청소기

연산자 끼워넣기

스타트와 링크

경사로

톱니바퀴

감시

사다리 조작

드래곤 커브

치킨 배달

큐빙

인구 이동

나무 재테크

아기 상어

미세먼지 안녕!

낚시왕

이차원 배열과 연산

연구소 3

게리맨더링 2

새로운 게임 2

원판 돌리기

주사위 윷놀이

모노미노도미노 2

청소년 상어

어른 상어

스타트 택시

컨베이어 벨트 위의 로봇

Last updated