coding-test

<백준> 5427 불 / C++ 풀이

도멩 2024. 1. 7. 16:45

중점:

1. 4179번 문제와 동일한 로직 사용

2. 이때 test case가 있기 때문에 break시에 queue를 초기화 해야한다.

3. bool 값을 이용해서 출력


정답 코드:

#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second

int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

string board[1002];
int vis1[1002][1002];
int vis2[1002][1002];

int t, w, h;

int main(void){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> t;

    while (t--)
    {
        cin >> w >> h;

        queue<pair<int, int> > Q1;
        queue<pair<int, int> > Q2;


        int result;
        bool escape = false;

        for (int i = 0; i < h; i++){
            cin >> board[i];

            fill(vis1[i], vis1[i] + w, -1);
            fill(vis2[i], vis2[i] + w, -1);

            for (int j = 0; j < w; j++){
                if (board[i][j] == '*'){
                    vis1[i][j] = 0;
                    Q1.push({i, j});
                }

                if (board[i][j] == '@'){
                    vis2[i][j] = 0;
                    Q2.push({i, j});
                }
            }
        }

        while (!Q1.empty())
        {
            auto cur = Q1.front();
            Q1.pop();

            for(int dir = 0; dir < 4; dir++){
                int nx = cur.X + dx[dir];
                int ny = cur.Y + dy[dir];

                if (nx < 0 || nx >= h || ny < 0 || ny >= w) continue;
                if (vis1[nx][ny] >= 0 || board[nx][ny] == '#') continue;

                vis1[nx][ny] = vis1[cur.X][cur.Y] + 1;
                Q1.push({nx, ny});
            }
        }
        
        while (!Q2.empty() && !escape)
        {
            auto cur = Q2.front();
            Q2.pop();
            
            for (int dir = 0; dir < 4; dir++){
                int nx = cur.X + dx[dir];
                int ny = cur.Y + dy[dir];

                if (nx < 0 || nx >= h || ny < 0 || ny >= w){
                    escape = true;
                    result = vis2[cur.X][cur.Y] + 1;
                    break;
                }

                if (vis2[nx][ny] >= 0 || board[nx][ny] == '#') continue;
                if (vis1[nx][ny] != -1 && vis1[nx][ny] <= vis2[cur.X][cur.Y] + 1) continue;

                vis2[nx][ny] = vis2[cur.X][cur.Y] + 1;
                Q2.push({nx, ny});
            }
        }

        if (!escape){
            cout << "IMPOSSIBLE" << endl;
        } else {
            cout << result << endl;
        }
    }
}