16918 - 봄버맨

2025. 3. 6. 16:29PS/백준

문제

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

느낀점

처음에는 4번마다 반복된다고 생각해서 4로 나눈 나머지를 이용해서 풀었는데, 바로 틀렸다.. 그래서 그냥 시뮬레이션 하듯이 각 경우를 생각해주었다.. 아직도 ==1, %4 == 1의 차이를 모르겠지만.. 어쨌든 풀었다.

풀이

#include <iostream>
#include <set>
#include <string>
#include <vector>

using namespace std;

#define pii pair<int, int>

vector<pii> direction = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

void bomb(int R, int C, int N, vector<string> &board, vector<vector<int>> &check)
{
    int timer = 2;
    while (1)
    {
        if (timer == N + 1)
        {
            break;
        }
        else if (timer % 2 == 0)
        {
            for (int i = 0; i < R; i++)
            {
                for (int j = 0; j < C; j++)
                {
                    if (board[i][j] == '.')
                    {
                        board[i][j] = 'O';
                        check[i][j] = timer + 3;
                    }
                }
            }
        }
        else
        {
            for (int i = 0; i < R; i++)
            {
                for (int j = 0; j < C; j++)
                {
                    if (check[i][j] == timer)
                    {
                        board[i][j] = '.';
                        check[i][j] = -1;
                        for (size_t k = 0; k < direction.size(); k++)
                        {
                            int dy = i + direction[k].first;
                            int dx = j + direction[k].second;
                            if (dx < 0 || dx >= C || dy < 0 || dy >= R)
                            {
                                continue;
                            }
                            board[dy][dx] = '.';
                        }
                    }
                }
            }
        }
        timer++;
    }
}

int main()
{
    int R, C, N;
    cin >> R >> C >> N;
    vector<string> board(R);
    vector<vector<int>> check(R, vector<int>(C, -1));

    for (size_t i = 0; i < R; i++)
    {
        cin >> board[i];
        for (size_t j = 0; j < board[i].size(); j++)
        {
            if (board[i][j] == 'O')
            {
                check[i][j] = 3;
            }
        }
    }
    bomb(R, C, N, board, check);
    for (int i = 0; i < R; i++)
    {
        for (int j = 0; j < C; j++)
        {
            cout << board[i][j];
        }
        cout << "\n";
    }

    return 0;
}

'PS > 백준' 카테고리의 다른 글

17276 - 배열 돌리기  00 2025.03.08
16924 - 십자가 찾기  00 2025.03.07
9081 - 단어 맞추기  00 2025.03.05
3495 - 아스키 도형  00 2025.03.04
2615 - 오목  00 2025.03.04