https://www.acmicpc.net/problem/16918
시간순서대로 폭탄의 그룹을 알파벳으로 표현해봤다 x 표시는 폭탄이 터진것
A는 가운데 폭탄 하나인 그룹
B는 나머지 공간에 폭탄들 그룹
C는 A가 터진후 빈공간에 설치된 폭탄들의 그룹
D는 B가 터진후 빈공간에 설치된 폭탄들의 그룹
N초가 흐른후 폭탄의 상태를 구해야 하는 문제이다
폭탄들이 연쇄폭발을 일을킨다면 BFS or DFS 를 사용해야했을것인데 이 문제는 그렇지 않았다
그리고 이문제는 같은 시간에 설치된 폭탄은 옆에 폭탄을 터트리지 않고 각자 터트리도록 해야한다
문제 밑에 힌트를 보면 그렇게 작동하는것을 알 수 있다
import java.io.*;
public class Main
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int R = Integer.parseInt(input[0]);
int C = Integer.parseInt(input[1]);
int N = Integer.parseInt(input[2]);
int[][] board = new int[R][C];
for(int i = 0; i < R; ++i)
{
input = br.readLine().split("");
for(int j = 0; j < C; ++j)
{
if(input[j].equals("."))
board[i][j] = 0;
else
board[i][j] = 3;
}
}
boolean install = false;
int time = 1;
while(N+1 > time)
{
if(time >= 2)
install = !install;
updateBoard(board, R, C, install);
time++;
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < R; ++i)
{
for(int j = 0; j < C; ++j)
{
if(board[i][j] == 0)
sb.append(".");
else
sb.append("O");
}
sb.append("\n");
}
System.out.println(sb);
}
public static void updateBoard(int[][] board, int R, int C, boolean install)
{
int[][] dir = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
for(int i = 0; i < R; ++i)
{
for(int j = 0; j < C; ++j)
{
if(board[i][j] == 1)//pang!
{
board[i][j] = 0;
for(int k = 0; k < 4; ++k)
{
int r = i+dir[k][0];
int c = j+dir[k][1];
if(r >= 0 && r < R && c >= 0 && c < C
&& board[r][c] != 1)//같은시간에 터지는 폭탄은 각각 터트린다
{
board[r][c] = 0;
}
}
}
else if(board[i][j] > 1)
board[i][j]--;
if(install)
{
if(board[i][j] == 0)
board[i][j] = 3;
}
}
}
}
}