본문 바로가기

OJ

[BOJ] 25552 잔디 예측하기 (JAVA)

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

 

25552번: 잔디 예측하기

첫째 줄에 직사각형 모양 토지의 행과 열의 수 $N, M$이 주어진다. $(1 \leq N, M \leq 1\,000)$ 이후 초기 잔디의 상태가 $N$줄에 걸쳐 각각 $M$칸씩 주어진다. 이후 잔디가 퍼질 범위 $D$가 주어진다. $(1 \leq

www.acmicpc.net

BFS를 이용하여 해결하면서 잔디 예측사 1급 시험에 통과했습니다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
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 StringTokenizer st;
    static int N, M, D;
    static char[][] before, after;
    static boolean[][] visited;
    static Queue<int[]> q = new LinkedList<>();

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

        st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        before = new char[N][M];
        after  = new char[N][M];
        visited = new boolean[N][M];
        for (int i = 0; i < N; i++) {
            String input = br.readLine();
            for (int j = 0; j < M; j++) {
                before[i][j] = input.charAt(j);
                if (before[i][j] == 'O') {
                    visited[i][j] = true;
                    q.offer(new int[] { i, j });
                }
            }
        }
        D = Integer.parseInt(br.readLine());
        for (int i = 0; i < N; i++) {
            after[i] = br.readLine().toCharArray();
        } // end of input

        while (!q.isEmpty()) {
            int[] a = q.poll();

            for (int i = a[0] - D; i <= a[0] + D; i++) {
                for (int j = a[1] - D; j <= a[1] + D; j++) {
                    if (0 <= i && i < N && 0 <= j && j < M && Math.abs(a[0] - i) + Math.abs(a[1] - j) <= D && after[i][j] == 'O' && !visited[i][j]) {
                        visited[i][j] = true;
                        q.offer(new int[] { i, j });
                    }
                }
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if ((after[i][j] == 'O' && !visited[i][j]) || (after[i][j] == 'X' && before[i][j] == 'O')) {
                    System.out.print("NO");
                    return;
                }
            }
        }
        System.out.print("YES");

    }
	
}

'OJ' 카테고리의 다른 글

[BOJ] 13909 창문 닫기 (JAVA)  (0) 2023.05.04
[BOJ] 27495 만다라트 만들기 (JAVA)  (0) 2023.05.03
[BOJ] 1205 등수 구하기 (JAVA)  (0) 2023.05.01
[BOJ] 11003 최솟값 찾기 (JAVA)  (1) 2023.04.30
[BOJ] 5297 키로거 (JAVA)  (1) 2023.04.29