※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 10349번 문제인 Wet Tiles이다.
문제는 아래 링크를 확인하자.

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

 

T분 뒤에 어떤 칸이 젖어있으려면 어떤 물이 새는 곳까지의 거리가 T-1 이하여야 함을 관찰하자. 단 여기서 두 칸 사이의 거리는 한 칸에서 다른 칸으로 벽이 아닌 인접한 칸으로의 이동만을 이용하여 이동할 때 필요한 최소 이동횟수(단, 이동이 불가능하면 무한대)라 하자.

 

따라서 물이 새는 칸들을 시점으로 하는 multisource BFS를 돌려 각 칸이 젖기 위한 최소시간을 구해 문제를 쉽게 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
#include <queue>
#include <utility>
using namespace std;

int R, C, T, L, W;

int dist[1002][1002];
queue<pair<int, int>> que;
int dr[4] = {0,0,1,-1};
int dc[4] = {1,-1,0,0};

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

    while (cin >> R >> C >> T >> L >> W) {
        for (int r = 1; r <= R; r++) {
            for (int c = 1; c <= C; c++) {
                dist[r][c] = 0;
            }
        }
        while (L--) {
            int r, c; cin >> r >> c;
            dist[r][c] = 1;
            que.push(make_pair(r, c));
        }
        while (W--) {
            int r1, c1, r2, c2; cin >> r1 >> c1 >> r2 >> c2;
            if (r1 == r2) {
                if (c1 > c2) swap(c1, c2);
                for (int c = c1; c <= c2; c++) dist[r1][c] = 1000000007;
            }
            else if (c1 == c2) {
                if (r1 > r2) swap(r1, r2);
                for (int r = r1; r <= r2; r++) dist[r][c1] = 1000000007;
            }
            else if (r2 - r1 == c2 - c1) {
                if (r1 > r2) swap(r1, r2), swap(c1, c2);
                for (int r = r1, c = c1; r <= r2; r++, c++) dist[r][c] = 1000000007;
            }
            else {
                if (r1 > r2) swap(r1, r2), swap(c1, c2);
                for (int r = r1, c = c1; r <= r2; r++, c--) dist[r][c] = 1000000007;
            }
        }

        while (!que.empty()) {
            int r = que.front().first, c = que.front().second; que.pop();
            for (int i = 0; i < 4; i++) {
                int rr = r + dr[i], cc = c + dc[i];
                if (rr < 1 || rr > R || cc < 1 || cc > C || dist[rr][cc]) continue;
                dist[rr][cc] = dist[r][c] + 1;
                que.push(make_pair(rr, cc));
            }
        }
        
        int ans = 0;
        for (int r = 1; r <= R; r++) {
            for (int c = 1; c <= C; c++) {
                if (dist[r][c] && dist[r][c] <= T) ans++;
            }
        }
        cout << ans << '\n';
    }
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25993 // C++] Bellevue  (5) 2024.09.02
[BOJ 23930 // C++] Parcels  (6) 2024.09.01
[BOJ 10425 // C++] 피보나치 인버스  (1) 2024.08.30
[BOJ 1206 // C++] 사람의 수  (2) 2024.08.29
[BOJ 32065 // C++] Short Function  (0) 2024.08.28

+ Recent posts