7576 - 토마토

나중에 BFS를 이용하여 풀이 시도해 볼 것

Solution

code

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

int propagate(int ** arr, int M, int N, queue<pair<int, int>> * q)
{
    int result = 0;
    int dc[4] = {1, 0, -1, 0};
    int dr[4] = {0, 1, 0, -1};
    vector<pair<int, int>> nextRipe;

    while(!(q->empty()))
    {
        int c = q->front().first; int r = q->front().second;
        for(int i = 0; i < 4; i++)
        {
            int col = c + dc[i]; int row = r + dr[i];
            if(col < 0 || row < 0 || col >= N || row >= M) continue;
            if(arr[col][row] == -1) continue;
            if(arr[col][row] == 0)
            {
                arr[col][row] = 1;
                nextRipe.push_back({col, row});
                result++;
            }
        }
        q->pop();
    }
    for(int i = 0; i < nextRipe.size(); i++)
        q->push(nextRipe[i]);
    return result;
}

int dayCalc(int ** arr, int M, int N, queue<pair<int, int>> q)
{
    int result = 0;
    int curCount = 0;
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            if(arr[i][j] == 0) curCount++;
    if(curCount == 0) return result;
    int prevCount = 0;
    int tomato = 0;
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            if(arr[i][j] != -1) tomato++;
    prevCount = curCount;
    
    while(true)
    {
        curCount -= propagate(arr, M, N, &q);
        if(curCount == prevCount)
        {
            int ripedTomato = 0;
            for(int i = 0; i < N; i++)
                for(int j = 0; j < M; j++)
                    if(arr[i][j] == 1) ripedTomato++;
            if(ripedTomato == tomato) return result;
            return -1;
        }
        prevCount = curCount;
        result++;
    }
}

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

    int M, N;
    cin >> M >> N;
    int ** arr = new int*[N];
    queue<pair<int, int>> nextRipeQueue;
    for(int i = 0; i < N; i++)
    {
        arr[i] = new int[M];
        for(int j = 0; j < M; j++)
        {
            cin >> arr[i][j];
            if (arr[i][j] == 1) nextRipeQueue.push({i, j});
        }
    }

    cout << dayCalc(arr, M, N, nextRipeQueue) << endl;
    return 0;
}

ref

7576번: 토마토