백준의 봄버맨(16918) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
1) 먼저 문제의 조건에 맞게 각 시간에 어떤 일이 일어나는지, 물론 문제를 읽어봤겠지만 정리를 한번 해보고 들어가자.
1. 초기에 봄버맨이 특정 위치에 폭탄을 설치한다. (현재 시간 0초)
2. 1초 동안 아무것도 하지 않는다.(현재 시간 1초)
3. 1초 동안, 폭탄이 없는 위치에 폭탄을 설치한다.(현재 시간 2초)
4. 현재 시간이 3초가 되기 때문에, 0초에 박은 폭탄이 3초후인, 지금 이 시간에 터져버린다.(인접한 폭탄도 함께)
5. 3, 4를 반복 !
그럼 좀 더 깔끔하게 시간의 흐름에 따라 정리를 해보자.
0초 = 폭탄을 심는다.(초기상태)
1초 = 아무것도 하지 않는다.
2초 = 폭탄이 없는 위치에 폭탄을 설치한다.
3초 = 0초에 심은 폭탄이 터진다.
4초 = 폭탄이 없는 위치에 폭탄을 설치한다.
5초 = 2초에 심은 폭탄이 터진다.
6초 = 폭탄이 없는 위치에 폭탄을 설치한다.
7초 = 4초에 심은 폭탄이 터진다.
이런식으로 진행될 것이다. 잘보면, 0~2초를 제외한 2초 이후에 시간들을 보면, 짝수초에는 폭탄을 설치, 홀수초에는 폭탄이
터지는 것을 반복한다는 것을 알 수 있다.
즉, 우리는 N초 까지, 위의 규칙을 반복하기만 한다면 정답을 출력해낼 수 있다.
사실, 폭탄을 설치한다는 것은 문제가 되지 않지만, 어느 폭탄이 몇초에 터지는지를 우리는 저장해놓고 알아내야 한다.
본인은 이 부분을 위해서 Boom_Time[][] 이라는 2차원 배열을 하나 더 만들어주었다.
Boom_Time[a][b] = c의 의미는 (a, b)에 있는 폭탄은 c초에 터집니다 를 의미한다.
즉, 홀수초에 폭탄이 터진다는 것을 알아낸 우리는, 홀수초마다 맵 전체를 돌면서, 현재 시간과 Boom_Time[][]의 값이 같다면
그 폭탄을 다시 폭탄이 없는 상태로 바꿔주면 된다. 폭탄을 없앰과 동시에 Boom_Time[][]의 값도 다시 0으로 초기화 시켜줘야
된다는 점을 까먹지 말자.
[ 소스코드 ]
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 | #include<iostream> #include<vector> #define endl "\n" #define MAX 200 using namespace std; int R, C, N; int Boom_Time[MAX][MAX]; char MAP[MAX][MAX]; int dx[] = { 0, 0, 1, -1 }; int dy[] = { 1, -1, 0, 0 }; void Input() { 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') { Boom_Time[i][j] = 3; } } } } void Install_Boom(int T) { for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (MAP[i][j] == 'O') continue; MAP[i][j] = 'O'; Boom_Time[i][j] = T + 3; } } } void Delete_Boom(int T) { for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (Boom_Time[i][j] == T) { for (int k = 0; k < 4; k++) { int nx = i + dx[k]; int ny = j + dy[k]; if (nx < 0 || ny < 0 || nx >= R || ny >= C) continue; if (MAP[nx][ny] == '.') continue; MAP[nx][ny] = '.'; } MAP[i][j] = '.'; Boom_Time[i][j] = 0; } } } } void Print() { for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { cout << MAP[i][j]; } cout << endl; } } void Solution() { int Time = 2; while (1) { if (Time == N + 1) break; if (Time % 2 == 0) { Install_Boom(Time); } else { Delete_Boom(Time); } Time++; } Print(); } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 16637 ] 괄호 추가하기 (1) (C++) (4) | 2019.03.12 |
---|---|
[ 백준 1052 ] 물병 (C++) (0) | 2019.03.11 |
[ 백준 2631 ] 줄 세우기 (C++) (1) | 2019.03.11 |
[ 백준 2151 ] 거울 설치 (C++) (2) | 2019.03.10 |
[ 백준 2186 ] 문자판 (C++) (6) | 2019.03.10 |