[BOJ] 2638. 치즈

Apr 2, 2019


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

치즈가아닌 바깥지역에서 BFS를 돌려주고 BFS를 돌리다가 치즈인 경우 해당 좌표의 카운트를 +1 해줬습니다.

카운트가 2가 되면 공기에 노출된 변이 2개인 것이므로 이 치즈의 좌표를 따로 melt라는 큐에 담고

BFS가 끝난 후 melt 큐에서 좌표를 꺼내 치즈를 녹여줬습니다.

이렇게 반복해서 시간을 계산했습니다.

#include <iostream>
#include <queue>
using namespace std;
int n, m;
int map[101][101];
queue <pair<int, int>> q;//bfs위해
queue <pair<int, int>> melt;//녹을치즈 체크
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
bool bfs() {
    bool allMelt = true;
    int cnt[101][101] = { 0, };//공기에 노출된 변의 갯수
    bool ch[101][101] = { 0, };//bfs사용시 방문한 곳
    while (!q.empty()) {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && ny >= 0 && nx < n&&ny < m&&ch[nx][ny] == false) {
                if (map[nx][ny] == 1) {
                    allMelt = false;//여길 거쳤으면 치즈가 있는 것(안거치면 없는 것)
                    cnt[nx][ny] += 1;
                    if (cnt[nx][ny] == 2) melt.push(make_pair(nx, ny));
                }
                else {
                    ch[nx][ny] = true;
                    q.push(make_pair(nx, ny));
                }
            }
        }
    }
    while (!melt.empty()) {//melt큐에 담긴 치즈들 녹인다
        int x = melt.front().first;
        int y = melt.front().second;
        map[x][y] = 0;
        melt.pop();
    }
    return allMelt;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> map[i][j];

    int time = 0;
    while (1) {
        time++;
        q.push(make_pair(0, 0));
        if (bfs() == true) break;//모두녹았으면break
    }
    cout << time - 1;
}
  • 나 혼자 말하고 나 혼자 듣는 말

….