본문 바로가기
BaekJoon/C++

2638 : 치즈 (C++)

by GrayChoi 2021. 2. 22.
반응형

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표

www.acmicpc.net


놀랍게도 앞에 글과 이름은 같지만 번호는 다른 문제이다!

앞에 치즈 문제와는 다르게 이번 치즈문제는 공기와 접촉한 변이 2개 이상 일 때만 녹는다!

이에 초점을 맞추고 문제를 해결하였다.

#include<iostream>
#include<queue>
#include<cstring>

using namespace std;

int N, M, hours;
int counting = 1;

int map[100][100];
bool visit[100][100];

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

queue<pair<int, int>> q;

void airBfs() {
    int x = q.front().first;
    int y = q.front().second;
    visit[x][y] = true;

    while(!q.empty()) {
        x = q.front().first;
        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 && nx < N && ny >= 0 && ny < M) {
                if(map[nx][ny] == 0 && visit[nx][ny] == false) {
                    q.push({nx, ny});
                    visit[nx][ny] = true;
                }
            }
        }
    }


}

void meltingCheese() {
    for(int x = 1; x < N-1; x++) {
        for(int y = 1; y < M-1; y++) {
            if(map[x][y] == 1) {
                int cnt = 0;
                for(int i = 0; i < 4; i++) {
                    int nx = x + dx[i];
                    int ny = y + dy[i];
                    if(visit[nx][ny] == true) {
                        // 치즈 옆에 공기가 접촉하면
                        cnt++;
                    }

                    if(cnt > 1) {
                        // 접촉하는 변이 2개 이상일 때
                        map[x][y]--;
                        break;
                    }
                }
            }
        }
    }
}

int countingCheese(int counting) {
    for(int x = 1; x < N-1; x++) {
        for(int y = 1; y < M-1; y++) {
            if(map[x][y] == 1) {
                counting++;
            }
        }
    }

    return counting;
}

int main() {
    scanf("%d %d", &N, &M);

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            scanf("%d", &map[i][j]);
        }
    }

    while(counting != 0) {
        counting = 0;

        memset(visit, false, sizeof(visit));
        q.push({0, 0});
        airBfs();
        meltingCheese();
        counting = countingCheese(counting);
        hours++;
    }

    printf("%d\n", hours);

    return 0;
}
반응형

'BaekJoon > C++' 카테고리의 다른 글

1927 : 최소 힙 (C++)  (0) 2021.02.24
11279 : 최대 힙 (C++)  (0) 2021.02.24
2636 : 치즈 (C++)  (0) 2021.02.22
14502 : 연구소 (C++)  (0) 2021.02.20
13305 : 주유소 (C++)  (0) 2021.02.19

댓글