Baekjoon

Baekjoon 16918번 봄버맨

ppwag 2020. 10. 19. 13:40

문제

https://www.acmicpc.net/problem/16918

걸린 시간

00 : 39 : 20

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int r, c, n;
int dy[4] = {1, -1, 0, 0};
int dx[4] = {0, 0, -1, 1};
vector<vector<int>> grid;

void boom(int y, int x){
    grid[y][x] = 0;
    for(int i = 0; i < 4; i++){
        int ny = y+dy[i];
        int nx = x+dx[i];
        if(0 <= ny && ny < r && 0 <= nx && nx < c)
            if(grid[ny][nx] != 1)
                grid[ny][nx] = 0;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> r >> c >> n;
    grid.resize(r, vector<int>(c, 0));
    // 0 ~ 1 sec
    char init;
    for(int y = 0; y < r; y++)
        for(int x = 0; x < c; x++){
            cin >> init;
            if(init == 'O') grid[y][x] = 2;
            else grid[y][x] = 0;
        }
    // 2 ~ n sec
    for(int i = 2; i <= n; i++){
        if(i%2 == 0){ // 폭탄 설치
            for(int y = 0; y < r; y++)
                for(int x = 0; x < c; x++)
                    if(grid[y][x] == 0) grid[y][x] = 3;
                    else if(grid[y][x] > 0) grid[y][x]--;
        }
        else{ // 폭팔
            for(int y = 0; y < r; y++)
                for(int x = 0; x < c; x++)
                    if(grid[y][x] == 1) boom(y, x);
                    else if(grid[y][x] > 0) grid[y][x]--;
        }
    }
    for(int y = 0; y < r; y++){
        for(int x = 0; x < c; x++)
            if(grid[y][x] > 0) cout << 'O';
            else cout << '.';
        cout << "\n";
    }
    return 0;
}

쉬운 구현 문제였지만 예외를 처리해주는 과정에서 시간이 조금 걸렸다. bfs 로도 풀 수 있다고 하는데 어떻게 가능한지 궁금하다.

댓글