본문 바로가기

OJ

[BOJ] 11967 불켜기 (JAVA)

https://www.acmicpc.net/problem/11967

 

11967번: 불켜기

(1, 1)방에 있는 스위치로 (1, 2)방과 (1, 3)방의 불을 켤 수 있다. 그리고 (1, 3)으로 걸어가서 (2, 1)방의 불을 켤 수 있다. (2, 1)방에서는 다시 (2, 2)방의 불을 켤 수 있다. (2, 3)방은 어두워서 갈 수 없으

www.acmicpc.net

BFS 문제입니다.

불이 켜진 방으로만 진행할 수 있는데, 어떤 조건일 때 큐에 삽입할지 생각해보는 게 좋겠습니다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;
    static int N, M;
    static int[] dr = { -1,  0,  1,  0 };
    static int[] dc = {  0,  1,  0, -1};
    static ArrayList<int[]>[][] list;

    public static void main(String[] args) throws Exception {

        st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        list = new ArrayList[N][N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                list[i][j] = new ArrayList<>();
            }
        }
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int r = Integer.parseInt(st.nextToken()) - 1;
            int c = Integer.parseInt(st.nextToken()) - 1;
            int rr = Integer.parseInt(st.nextToken()) - 1;
            int cc = Integer.parseInt(st.nextToken()) - 1;
            list[r][c].add(new int[] { rr, cc });
        } // end of input

        int result = 1;
        Queue<int[]> q = new LinkedList<>();
        boolean[][] light = new boolean[N][N];
        boolean[][] visited = new boolean[N][N];
        light[0][0] = true;
        visited[0][0] = true;
        q.offer(new int[] { 0, 0 });

        while(!q.isEmpty()) {

            int[] now = q.poll();

            // 다음으로 불을 켤 수 있는 방들에 대해
            for (int[] next : list[now[0]][now[1]]) {

                // 아직 불이 켜지지 않았다면
                if(!light[next[0]][next[1]]) {

                    light[next[0]][next[1]] = true;
                    result++;

                }

                // 아직 방문하지 않았다면
                if(!visited[next[0]][next[1]]) {

                    for (int dir = 0; dir < 4; dir++) {

                        int nr = next[0] + dr[dir];
                        int nc = next[1] + dc[dir];

                        if(0 <= nr && nr < N && 0 <= nc && nc < N && visited[nr][nc]) {

                            q.offer(new int[] { next[0], next[1] });
                            visited[next[0]][next[1]] = true;

                        }

                    }

                }

            }

            for (int dir = 0; dir < 4; dir++) {

                int nr = now[0] + dr[dir];
                int nc = now[1] + dc[dir];

                if(0 <= nr && nr < N && 0 <= nc && nc < N && !visited[nr][nc] && light[nr][nc]) {

                    q.offer(new int[] { nr, nc });
                    visited[nr][nc] = true;

                }

            }

        }

        System.out.print(result);

    }

}

'OJ' 카테고리의 다른 글

[BOJ] 16930 달리기 (JAVA)  (2) 2023.01.08
[BOJ] 5427 불 (JAVA)  (0) 2023.01.07
[BOJ] 16918 봄버맨 (JAVA)  (0) 2023.01.05
[BOJ] 1026 보물 (JAVA)  (0) 2023.01.04
[BOJ] 17182 우주 탐사선 (JAVA)  (2) 2023.01.03