-
백준 16918번 봄버맨PS 2020. 2. 9. 21:46
https://www.acmicpc.net/problem/16918
16918번: 봄버맨
첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.
www.acmicpc.net
<접근방법>
시간 개념, 라운드 개념이 저에겐 어렵습니다. 항상 두루뭉실하게 생각하는 습관 때문인거 같습니다.
그래서 각 시간마다 명확하게 무엇을 하는지 알 필요가 있다고 생각했습니다.
종이에 써보면 결국 2초 이상에서는 짝수에는 폭설, 홀수에는 3초 전의 폭탄이 폭발이 일어나는 것을
확인할 수 있었습니다.
그리고 폭탄은 '동시에' 터지는 개념이기 때문에 구현에 유의하여야 합니다.
<코드>
#include <iostream> #include <algorithm> #include <queue> using namespace std; struct info { int y, x, t; }; int n, m, t; char map[202][202]; int tmap[202][202]; int dy[4] = {1, -1, 0, 0}; int dx[4] = {0, 0, 1, -1}; int T; void print() { //puts(""); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cout << map[i][j]; } puts(""); } } void set_bomb() { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (map[i][j] == '.') { map[i][j] = 'O'; tmap[i][j] = T+3; } } } } void pung() { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (tmap[i][j] == T) { for (int k = 0; k < 4; k++) { int ty = i + dy[k]; int tx = j + dx[k]; if (ty < 0 || ty >= n || tx < 0 || tx >= m) continue; map[ty][tx] = '.'; } map[i][j] = '.'; tmap[i][j] = 0; } } } } void simul() { if (t == 1) return; T = 1; while (1) { T++; if (T > t) break; if (T % 2 == 0) {//폭설 set_bomb(); } else { pung(); } } } int main() { cin >> n >> m >> t; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> map[i][j]; if (map[i][j] == 'O') { tmap[i][j] = 3; } } } simul(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cout << map[i][j]; } puts(""); } return 0; }
<느낀 점>
-확실하지 않으면 확실하게 하고 코딩하자
반응형'PS' 카테고리의 다른 글
백준 17135번 캐슬 디펜스 (2) 2020.02.10 백준 16954번 움직이는 미로 탈출 (1) 2020.02.10 백준 16234번 인구 이동 (0) 2020.02.07 백준 16235번 나무 재테크 (0) 2020.02.07 백준 16236번 아기상어 (0) 2020.02.07