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 |