봄버맨은 크기가 R×C인 직사각형 격자판 위에서 살고 있다. 격자의 각 칸은 비어있거나 폭탄이 들어있다.
폭탄이 있는 칸은 3초가 지난 후에 폭발하고, 폭탄이 폭발한 이후에는 폭탄이 있던 칸이 파괴되어 빈 칸이 되며, 인접한 네 칸도 함께 파괴된다. 즉, 폭탄이 있던 칸이 (i, j)인 경우에 (i+1, j), (i-1, j), (i, j+1), (i, j-1)도 함께 파괴된다. 만약, 폭탄이 폭발했을 때, 인접한 칸에 폭탄이 있는 경우에는 인접한 폭탄은 폭발 없이 파괴된다. 따라서, 연쇄 반응은 없다.
봄버맨은 폭탄에 면역력을 가지고 있어서, 격자판의 모든 칸을 자유롭게 이동할 수 있다. 봄버맨은 다음과 같이 행동한다.
폭탄을 설치해놓은 초기 상태가 주어졌을 때, N초가 흐른 후의 격자판 상태를 구하려고 한다.
예를 들어, 초기 상태가 아래와 같은 경우를 보자.
...
.O.
...
1초가 지난 후에는 아무 일도 벌어지지 않기 때문에, 위와 같다고 볼 수 있다. 1초가 더 흐른 후에 격자판의 상태는 아래와 같아진다.
OOO
OOO
OOO
1초가 지난 후엔 가운데에 있는 폭탄이 폭발해 가운데 칸과 인접한 네 칸이 빈 칸이 된다.
O.O
...
O.O
첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.
총 R개의 줄에 N초가 지난 후의 격자판 상태를 출력한다.
1초 후의 모습은 현재 모습이랑 똑같다. 하지만 2초 후에는 모든 격자판에 폭탄이 들어가야 하기 때문에 전부다 폭탄이다.
3초 후에는 처음 있던 폭탄들이 터지면서 현재 위치와 상하좌우의 폭탄을 없앤다.
다시 4초 후에는 모든 격자판에 폭탄이 들어간다. 5초 후에는 3초 때 있던 폭탄들이 터지면서 현재 위치와 상하좌우의 폭탄을 없앤다.
매 짝수초마다는 폭탄을 모든 격자판에 채우는 작업의 반복이므로 연산을 할 필요 없이 그냥 전체 폭탄을 출력하면 된다.
홀수초는 폭탄이 남아 있는 모습을 출력하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <iostream> #include <queue> using namespace std; char BOMB[201][201]; int R,C,N,mx[] = {0,1,0,-1}, my[] = {1,0,-1,0}; queue<pair<int, int> > q; void queueing() { for(int i=0;i<R;i++) for(int j=0;j<C;j++) if(BOMB[i][j] == 'O') q.push(make_pair(i,j)); } void fill() { for(int i=0;i<R;i++) for(int j=0;j<C;j++) if(BOMB[i][j] != 'O') BOMB[i][j] = 'O'; } void boom() { while(!q.empty()) { int x = q.front().first; int y = q.front().second; BOMB[x][y] = '.'; q.pop(); for(int i=0;i<4;i++) { int nx = x + mx[i]; int ny = y + my[i]; if(nx<0||ny<0||nx>=R||ny>=C) continue; BOMB[nx][ny] = '.'; } } } void solve() { for(int time=0;time<N;) { queueing(); time++; if (time == N) return; fill(); time++; if (time == N) return; boom(); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>R>>C>>N; string s; for(int i=0;i<R;i++) { cin>>s; for(int j=0;j<C;j++) BOMB[i][j] = s[j]; } if (N % 2 == 0) { for(int i=0;i<R;i++) { for(int j=0;j<C;j++) cout<<'O'; cout<<'\n'; } return 0; } else { solve(); for(int i=0;i<R;i++) { for(int j=0;j<C;j++) { cout<<BOMB[i][j]; } cout<<'\n'; } } return 0; } | cs |
20057. 마법사 상어와 토네이도 Gold IV(C++) (0) | 2020.10.30 |
---|---|
17837.새로운 게임2 GOLD II(C++) (0) | 2020.10.17 |
배열 돌리기 4 (C++) GOLD IV (0) | 2020.08.28 |
17140. ⚾ (C++) GOLD IV (0) | 2020.08.18 |
14891. 톱니바퀴(C++) SILVER I (0) | 2020.08.18 |
댓글 영역