danbibibi
article thumbnail
Published 2023. 3. 18. 23:47
BOJ 1584번: 게임 문제 풀이/백준

문제

문제 바로가기> BOJ 1584번: 게임

 

1584번: 게임

첫째 줄에 위험한 구역의 수 N이 주어진다. 다음 줄부터 N개의 줄에는 X1 Y1 X2 Y2와 같은 형식으로 위험한 구역의 정보가 주어진다. (X1, Y1)은 위험한 구역의 한 모서리이고, (X2, Y2)는 위험한 구역의

www.acmicpc.net

 

풀이

BFS 탐색을 진행하되,

안전한 구역인 경우, 그 구역에서 먼저 탐색을 진행해주기 위해 deque 자료구조를 이용했다!!

#include <iostream>
#include <queue>
#define MAX 501
#define DANGER 1
#define DEATH 2
using namespace std;

struct DATA
{
    int y, x, lose;
};

int N, M;
int map[MAX][MAX];
bool visited[MAX][MAX];
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};

void swap(int &a, int &b)
{
    if (b < a)
    {
        int tmp = b;
        b = a;
        a = tmp;
    }
}

void check_zone(int y1, int x1, int y2, int x2, int zone)
{
    swap(y1, y2); // y1이 y2 보다 작음을 보장
    swap(x1, x2); // x1이 x2 보다 작음을 보장

    for (int y = y1; y <= y2; y++)
    {
        for (int x = x1; x <= x2; x++)
            map[y][x] = zone;
    }
}

void input()
{
    int y1, x1, y2, x2;

    cin >> N;
    while (N--)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        check_zone(y1, x1, y2, x2, DANGER); // 위험 구역
    }

    cin >> M;
    while (M--)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        check_zone(y1, x1, y2, x2, DEATH); // 죽음 구역
    }
}

int solution()
{
    deque<DATA> dq;
    visited[0][0] = true;
    dq.push_back({0, 0, 0});

    while (!dq.empty())
    {
        int y = dq.front().y;
        int x = dq.front().x;
        int lose = dq.front().lose;
        dq.pop_front();

        if (y == MAX - 1 && x == MAX - 1)
            return lose;

        for (int d = 0; d < 4; d++)
        {
            int ny = y + dy[d];
            int nx = x + dx[d];
            if (ny < 0 || ny >= MAX || nx < 0 || nx >= MAX) // 범위를 벗어나는 경우
                continue;
            if (visited[ny][nx] || map[ny][nx] == DEATH) // 이미 방문한 경우, 죽음의 구역인 경우
                continue;
            visited[ny][nx] = true;
            if (map[ny][nx] == DANGER)            // 위험한 구역인 경우
                dq.push_back({ny, nx, lose + 1}); // 뒤에 넣어줌!!
            else
                dq.push_front({ny, nx, lose}); // 앞에 넣어줌!!
        }
    }
    return -1;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    input();
    cout << solution(); // 잃는 생명의 최솟값
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 12852번: 1로 만들기 2  (0) 2023.03.21
BOJ 2623번: 음악프로그램  (0) 2023.03.21
BOJ 2636번: 치즈  (0) 2023.03.18
BOJ 2842번 : 집배원 한상덕  (0) 2023.03.10
BOJ 1918번: 후위 표기식  (0) 2023.03.07
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로