본문 바로가기

BOJ/C++

[BOJ] 16918. 봄버맨

* 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