문제링크
16918번: 봄버맨
첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.
www.acmicpc.net
문제 풀이
시간의 순서대로 격자판의 상태를 나열하면 다음과 같다.
0초 : 초기상태
1초 : 초기상태와 동일(봄버맨이 아무것도 하지 않음)
2초 : 폭탄이 설치되어 있지 않은 모든 칸에 폭탄 설치
3초 : 0초에 설치되어 있던 폭탄이 폭발(폭발한 뒤의 격자판을 board_3이라고 가정)
4초 : board_3 격자판에 폭탄이 설치되어 있지 않은 모든 칸에 폭탄 설치
5초 : 2초에 설치한 폭탄이 폭발(폭발한 뒤의 격자판을 board_5라고 가정)
6초 : board_5 격자판에 폭탄이 설치되어 있지 않은 모든 칸에 폭탄 설치
...
봄버맨과 격자판은 위와 같은 방식으로 순환할 것이다. 자세히 살펴보면 한 가지 특징을 찾을 수 있는데(똑똑한 사람은 이미 찾았겠지만) 짝수 초일 때는 폭탄을 설치하고 홀수 초일 때는 폭탄이 폭발한다는 것이다.
char board[200][200]는 격자판의 상태를 저장하고
int _time[200][200]은 폭탄이 터지는 시간을 저장한다.
1초에는 봄버맨이 아무 일도 하지 않기 때문에 시작 시간 t를 2로 잡고 아래의 동작을 반복한다.
짝수 초 일 경우 - 폭탄 설치
(i, j)위치에 폭탄을 설치한다고 하면 board[i][j] 를 ‘O’로 바꿔주고, _time[i][j]를 현재 시간 t+3으로 바꿔주어야 한다.(3초 뒤에 터지기 때문)
홀수 초 일 경우 - 폭탄 폭발
(상, 하, 좌, 우 의 폭탄도 같이 폭발)(i, j)위치의 폭탄이 폭발한다고 하면 board[i][j] 를 ‘.’로 바꿔주고, 상, 하, 좌, 우를 확인하며 유효한 위치라면 각 위치의 board값도 ‘.’으로 바꿔주어야 한다.
특정 위치의 폭탄이 폭발하려면 _time[i][j]의 값이 현재 시간과 같아야 한다.