Problem Solving/BOJ

[백준 4179번] [BFS] 불!

  • -
728x90
반응형

Approach

https://viyoung.tistory.com/331와 동일하다.

 

[백준 5427번] [BFS] 불

Approach BFS를 2개 돌리면 된다. 시간 단위로 불과 상근이 모두 1칸씩 이동할 수 있으므로 상근이를 먼저 이동시키고 불을 이동시켜서 결과적으로 상근이가 경계선 밖을 넘는지 여부만 체크해주면

viyoung.tistory.com

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)

using namespace std;
typedef pair<int, int> pii;
int move_x[4] = {-1, 1, 0, 0};
int move_y[4] = {0, 0, -1, 1};
int r[1000][1000];
bool visited[1000][1000];

int main(void)
{
    memset(visited, 0, sizeof(visited));
    int n, m;
    cin >> n >> m;
    queue<pii> pos;
    queue<pii> fire_pos;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            char t;
            cin >> t;
            if (t == '.')
            {
                r[i][j] = 1;
            }
            else if (t == '#')
            {
                r[i][j] = 2;
            }
            else if (t == 'J')
            {
                r[i][j] = 3;
                pos.push(make_pair(i, j));
                visited[i][j] = 1;
            }
            else
            {
                r[i][j] = 4;
                fire_pos.push(make_pair(i, j));
                visited[i][j] = 1;
            }
        }
    }

    int move = 1;
    int flag = false;
    int imp_flag = false;
    while (true)
    {
        int human_q_size = pos.size();
        int fire_q_size = fire_pos.size();

        if (human_q_size == 0)
        {
            imp_flag = true;
            break;
        }

        for (int i = 0; i < human_q_size; i++)
        {
            int x = pos.front().first;
            int y = pos.front().second;
            pos.pop();
            if (r[x][y] != 3)
                continue;
            for (int j = 0; j < 4; j++)
            {
                int dx = x + move_x[j];
                int dy = y + move_y[j];
                if (dx < 0 || dx >= n || dy < 0 || dy >= m)
                {
                    flag = true;
                    break;
                }
                else
                {
                    if (!visited[dx][dy] && r[dx][dy] == 1)
                    {
                        pos.push(make_pair(dx, dy));
                        visited[dx][dy] = 1;
                        r[dx][dy] = 3;
                    }
                }
            }
        }
        if (flag == true || imp_flag == true)
            break;

        for (int i = 0; i < fire_q_size; i++)
        {
            int x = fire_pos.front().first;
            int y = fire_pos.front().second;
            fire_pos.pop();
            for (int j = 0; j < 4; j++)
            {
                int dx = x + move_x[j];
                int dy = y + move_y[j];
                if (dx < 0 || dx >= n || dy < 0 || dy >= m)
                    continue;
                else
                {
                    if (r[dx][dy] == 1 || r[dx][dy] == 3)
                    {
                        fire_pos.push(make_pair(dx, dy));
                        visited[dx][dy] = 1;
                        r[dx][dy] = 4;
                    }
                }
            }
        }
        move++;
    }
    if (imp_flag)
    {
        cout << "IMPOSSIBLE\n";
    }
    else
        cout << move << "\n";
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.