알고리즘
백준 16918번 붐버맨 (JAVA)
박카스마시며코딩
2023. 1. 30. 15:12
https://www.acmicpc.net/problem/16918
16918번: 봄버맨
첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.
www.acmicpc.net
package BOJ.simulation;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_16918 {
private static final char BOMB = 'O';
private static final char EMPTY = '.';
private static final int INT_EMPTY = -1;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int m = stoi.apply(st.nextToken());
int t = stoi.apply(st.nextToken());
int[][] map = new int[n][m];
for(int i = 0 ; i < n ; i++){
String command = br.readLine();
for(int j = 0 ; j < m ; j++){
char ch = command.charAt(j);
if(ch == EMPTY){
map[i][j] = INT_EMPTY;
}else{
map[i][j] = 1;
}
}
}
cal(map,n,m,t);
}
private static void cal(int[][]map,int n,int m,int t){
int time = 2;
while(time <= t){
if(time % 2 == 0){
putBomb(map,n,m,time);
}else{
if(time == 3){
bomb(map,n,m,time-2);
}else{
bomb(map,n,m,time-3);
}
}
// System.out.println(time);
// print(map,n,m);
time++;
}
printMap(map,n,m);
}
private static void print(int[][] map , int n , int m){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
System.out.print(map[i][j]);
}
System.out.println();
}
}
private static void printMap(int[][] map , int n , int m){
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(map[i][j] == INT_EMPTY){
sb.append(EMPTY);
}else{
sb.append(BOMB);
}
}
sb.append('\n');
}
System.out.println(sb.toString());
}
private static void putBomb(int[][]map,int n,int m,int time){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(map[i][j] == INT_EMPTY){
map[i][j] = time;
}
}
}
}
private static final int[] DY = {-1,0,1,0};
private static final int[] DX = {0,1,0,-1};
private static void bomb(int[][]map,int n,int m,int time){
boolean[][] check = new boolean[n][m];
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(map[i][j] == time){
check[i][j] = true;
}
}
}
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(check[i][j]){
map[i][j] = INT_EMPTY;
for(int k = 0 ; k < 4 ; k++){
int ny = i + DY[k];
int nx = j + DX[k];
if(ny >= 0 && ny < n && nx >= 0 && nx < m){
map[ny][nx] = INT_EMPTY;
}
}
}
}
}
}
}