
* bombTime[] 폭탄이 설치되는 시간을 저장한다.
* 처음 1초 동안 봄버맨은 아무것도 하지 않는다. -> n == 1일 때 입력받은 폭탄을 그대로 출력해야 한다.
* 1초 동안 폭탄이 없는 곳에 폭탄을 설치한다. (이때 설치하는 폭탄은 first (처음 폭탄이 터지는 시간) + 2 시간에 터진다. )
* 1초 프로세스 도중에 sec == n이 되면 실행을 멈춘다.
* 폭탄을 터트린다. (bomb(터질 폭탄 -> 이 시간에 터질 폭탄만 터트린다)) -> 1초 소요
* 폭탄은 터질 때 주변의 폭탄들을 같이 터트리기 때문에 자신과 같은 숫자를 가진 폭탄은 터트리지 않는다.
* 주변의 폭탄을 터트린 후에 현재 터져야 할 폭탄들을 터트려준다. (62 ~ 72 line)
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include <iostream> #include <vector> using namespace std; int r, c, n; char map[201][201]; int bombTime[201][201]; //터지는 시간을 저장 int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0}; typedef pair< int , int > pp; void print() { for ( int i = 0; i < r; i++) { for ( int j = 0; j < c; j++) { cout << map[i][j]; } cout << '\n' ; } } void fillBomb( int label) { for ( int i = 0; i < r; i++) { for ( int j = 0; j < c; j++) { if (map[i][j] == '.' ) { map[i][j] = 'O' ; bombTime[i][j] = label; } } } } void bomb( int label) { for ( int i = 0; i < r; i++) { for ( int j = 0; j < c; j++) { if (map[i][j] == 'O' && bombTime[i][j] == label) { for ( int d = 0; d < 4; d++) { int nx = i + dx[d]; int ny = j + dy[d]; if (nx < 0 || nx >= r || ny < 0 || ny >= c || bombTime[nx][ny] == label) continue ; if (map[nx][ny] == 'O' ) { map[nx][ny] = '.' ; bombTime[nx][ny] = 0; } } } } } for ( int i = 0; i < r; i++) { for ( int j = 0; j < c; j++) { if (bombTime[i][j] == label) { map[i][j] = '.' ; bombTime[i][j] = 0; //예전 폭탄들을 제거해준다. } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> r >> c >> n; for ( int i = 0; i < r; i++) { for ( int j = 0; j < c; j++) { cin >> map[i][j]; if (map[i][j] == 'O' ) { bombTime[i][j] = 3; //3초후에 터진다. } } } if (n == 1) { print(); return 0; } int sec = 0; int first = 3; sec++; //처음 1초는 아무것도 하지 않는다. int next = 0; while (1) { //폭탄이 설치되지 않은 칸에 폭탄을 설치한다. next = first + 2; fillBomb(next); //지금부로 3초 후에 터질 폭탄임을 표시 sec++; if (sec == n) break ; bomb(first); sec++; if (sec == n) break ; first = next; } print(); return 0; } |
'BOJ > C++' 카테고리의 다른 글
[BOJ] 16932. 모양 만들기 (0) | 2020.04.20 |
---|---|
[BOJ] 17822. 원판 돌리기 (0) | 2020.04.19 |
[BOJ] 9328. 열쇠 (0) | 2020.04.16 |
[BOJ] 14391. 종이조각 (0) | 2020.04.16 |
[BOJ] 1600. 말이 되고픈 원숭이 (0) | 2020.04.07 |