백준 20058

SJ Lee·2022년 2월 11일
0
#include <iostream>
#include <vector>
#include <queue>
 
#define MAX 70
#define endl "\n"
using namespace std;
 
int N, Q, Sum_Answer, Size_Answer;
int MAP[MAX][MAX];
bool Visit[MAX][MAX];
vector<int> Cmd;
 
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
 
int Max(int A, int B) { return A > B ? A : B; }
 
void Input()
{
    cin >> N >> Q;
    N = (1 << N);
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cin >> MAP[i][j];
            Sum_Answer += MAP[i][j];
        }
    }
    for (int i = 0; i < Q; i++)
    {
        int a; cin >> a;
        Cmd.push_back(a);
    }
}
 
void Turning(int a, int b, int Len)
{
    int Square = Len / 2;
    for (int Number = 0; Number < Square; Number++)
    {
        int Start_x = a + Number;
        int Start_y = b + Number;
        int End_x = a + Len - Number - 1;
        int End_y = b + Len - Number - 1;
 
        int x_Idx = End_x;
        int y_Idx = Start_y;
        int Idx = 0;
        vector<int> Temp;
        for (int i = Start_x; i < End_x; i++) Temp.push_back(MAP[i][Start_y]);
        for (int i = Start_x; i < End_x; i++) MAP[i][Start_y] = MAP[End_x][y_Idx++];
        for (int i = Start_y; i < End_y; i++) MAP[End_x][i] = MAP[x_Idx--][End_y];
        for (int i = End_x; i > Start_x; i--) MAP[i][End_y] = MAP[Start_x][y_Idx--];
        for (int i = End_y; i > Start_y; i--) MAP[Start_x][i] = Temp[Idx++];
    }
}
 
void Remake_MAP(int Len)
{
    for (int i = 0; i < N; i += Len)
    {
        for (int j = 0; j < N; j += Len)
        {
            Turning(i, j, Len);
        }
    }
}
 
void Melting_Ice()
{
    vector<pair<int, int>> V;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if (MAP[i][j] == 0) continue;
 
            int Cnt = 0;
            for (int k = 0; k < 4; k++)
            {
                int nx = i + dx[k];
                int ny = j + dy[k];
                if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
                if (MAP[nx][ny] == 0) continue;
                Cnt++;
            }
 
            if (Cnt < 3) V.push_back(make_pair(i, j));
        }
    }
 
    for (int i = 0; i < V.size(); i++)
    {
        int x = V[i].first;
        int y = V[i].second;
        MAP[x][y]--;
        Sum_Answer--;
    }
}
 
int BFS(int a, int b)
{
    queue<pair<int, int>> Q;
    Q.push(make_pair(a, b));
    Visit[a][b] = true;
    int Cnt = 1;
 
    while (Q.empty() == 0)
    {
        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 < N)
            {
                if (MAP[nx][ny] != 0 && Visit[nx][ny] == false)
                {
                    Visit[nx][ny] = true;
                    Q.push(make_pair(nx, ny));
                    Cnt++;
                }
            }
        }
    }
    return Cnt;
}
 
void Calculate_Ice_Size()
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if (MAP[i][j] == 0) continue;
            if (Visit[i][j] == true) continue;
            
            int Result = BFS(i, j);
            Size_Answer = Max(Size_Answer, Result);
        }
    }
}
 
void Solution()
{
    for (int i = 0; i < Q; i++)
    {
        int L = (1 << Cmd[i]);
        Remake_MAP(L);
        Melting_Ice();
    }
    Calculate_Ice_Size();
 
    cout << Sum_Answer << endl << Size_Answer << endl;
}
 
void Solve()
{
    Input();
    Solution();
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    Solve();
 
    return 0;
}

0개의 댓글