https://www.acmicpc.net/problem/16918
16918번: 봄버맨
첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.
www.acmicpc.net
구현 문제입니다.
홀수 초에 할 일, 짝수 초에 할 일로 구분해서 쉽게 풀 수 있었습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
int[] dr = { -1, 0, 1, 0 };
int[] dc = { 0, 1, 0, -1 };
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int R = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
Queue<int[]> q = new LinkedList<>();
char[][] arr = new char[R][C];
for (int i = 0; i < R; i++) {
arr[i] = br.readLine().toCharArray();
for (int j = 0; j < C; j++) {
if(arr[i][j] == 'O') q.offer(new int[] { i, j });
}
} // end of input
int time = 0;
while(++time < N) {
// 폭탄 놓기
if(time % 2 == 1) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if(arr[i][j] == '.') arr[i][j] = 'O';
else q.offer(new int[] { i, j });
}
}
// 터트리기
} else {
while(!q.isEmpty()) {
int[] pos = q.poll();
arr[pos[0]][pos[1]] = '.';
for (int dir = 0; dir < 4; dir++) {
int nr = pos[0] + dr[dir];
int nc = pos[1] + dc[dir];
if(0 <= nr && nr < R && 0 <= nc && nc < C) arr[nr][nc] = '.';
}
}
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
sb.append(arr[i][j]);
}
sb.append("\n");
}
System.out.print(sb.toString());
}
}
'OJ' 카테고리의 다른 글
[BOJ] 5427 불 (JAVA) (0) | 2023.01.07 |
---|---|
[BOJ] 11967 불켜기 (JAVA) (2) | 2023.01.06 |
[BOJ] 1026 보물 (JAVA) (0) | 2023.01.04 |
[BOJ] 17182 우주 탐사선 (JAVA) (2) | 2023.01.03 |
[BOJ] 2750 수 정렬하기 (JAVA) (0) | 2023.01.02 |