๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 20058 : ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด์Šคํ†ฐ

by Jaeguk 2022. 5. 31.
๋ฌธ์ œ ๋งํฌ

20058๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด์Šคํ†ฐ (acmicpc.net)

 

20058๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด์Šคํ†ฐ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ํŒŒ์ด์–ด๋ณผ๊ณผ ํ† ๋„ค์ด๋„๋ฅผ ์กฐํ•ฉํ•ด ํŒŒ์ด์–ด์Šคํ†ฐ์„ ์‹œ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜์€ ํŒŒ์ด์–ด์Šคํ†ฐ์„ ํฌ๊ธฐ๊ฐ€ 2N × 2N์ธ ๊ฒฉ์ž๋กœ ๋‚˜๋ˆ„์–ด์ง„ ์–ผ์ŒํŒ์—์„œ ์—ฐ์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์œ„์น˜ (r, c)๋Š” ๊ฒฉ์ž์˜ rํ–‰ c

www.acmicpc.net

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด ์„ธ๋ฒˆ์งธ ์‹œ๋ฆฌ์ฆˆ. ์—ญ์‹œ ๊ตฌํ˜„๋ฌธ์ œ๋‹ค.

ํ’€์ด

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ์ด๋ฒˆ์— ํŒŒ์ด์–ด์Šคํ†ฐ์„ ๋ฐฐ์› ๋‹ค.

์ƒ์–ด๊ฐ€ Q๋ฒˆ์˜ ๋ช…๋ น๋™์•ˆ ๋ช…๋ น์–ด L์„ ์ž…๋ ฅํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฒฉ์ž๋ฅผ 2^L X 2^L ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ฐ ๊ตฌ๊ฐ„๋ณ„๋กœ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „์‹œํ‚จ ํ›„, 3๊ฐœ ์ด์ƒ์˜ ์–ผ์Œ๊ณผ ์ธ์ ‘ํ•˜์ง€ ์•Š์€ ์–ผ์Œ์€ ์–‘์ด 1 ์ค„์–ด๋“ ๋‹ค.

N์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋ฉด ๊ฒฉ์ž์˜ ํฌ๊ธฐ๋Š” 2^N X 2^N์ด ๋œ๋‹ค.

๊ฒฉ์ž๋ฅผ ๊ฐ ๊ตฌ๊ฐ„๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค.

ํšŒ์ „ ํ•œ ํ›„์— ๋ชจ๋“  ๊ฒฉ์ž ์นธ์„ ๋Œ๋ฉด์„œ ์ธ์ ‘ํ•œ ์–ผ์Œ์ด 3๊ฐœ ์ดํ•˜๋ฉด ์–ผ์Œ์˜ ์–‘์„ 1 ์ค„์ธ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ์นธ์—์„œ ์–ผ์Œ์ด ์ค„์–ด๋“œ๋Š” ๊ฒƒ์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ์–‘์ด ์ค„์–ด๋“ค ์นธ์„ ๋”ฐ๋กœ ํ‘œ์‹œํ•ด ๋‘” ํ›„์— ํ•œ ๋ฒˆ์— ์–‘์„ ์ค„์—ฌ์ฃผ์—ˆ๋‹ค.

Q๋ฒˆ์˜ ๋ช…๋ น ํ›„์—, BFS ๋˜๋Š” DFS๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ€์žฅ ํฐ ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋•Œ ๋ฉ์–ด๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <deque>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<intint>vector<pair<intint>>, greater<pair<intint>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 64 + 5;
int N, Q;
int A[MAX_N][MAX_N];
int ans;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
int temp[MAX_N][MAX_N];
bool visited[MAX_N][MAX_N];
int add[MAX_N][MAX_N];
 
void Turn_A(int);
void Melting();
int BFS(pair<intint>);
bool is_ok(pair<intint>);
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> Q;
    N = (int)pow(2, N);
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            cin >> A[i][j];
 
    while (Q--) {
        int L; cin >> L;
        Turn_A(L);
        Melting();
    }
    int total_ice = 0;
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            total_ice += A[i][j];
 
    if (total_ice == 0) {
        cout << "0\n" << "0\n";
        return 0;
    }
    cout << total_ice <<"\n";
    int mass = -1;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (!visited[i][j] && A[i][j])
                mass = max(BFS({ i,j }), mass);
        }
    }
    cout << mass << "\n";
    return 0;
}
 
void Turn_A(int size) {
    size = (int)pow(2size);
    for (int i = 1; i <= N - size + 1; i += size) {
        for (int j = 1; j <= N - size + 1; j += size) {
            memset(temp, 0sizeof(temp));
            for(int k = 0; k<size; k++)
                for(int p = 0; p<size; p++)
                    temp[k][p] = A[i + k][j + p];
            for (int k = 0; k < size; k++) {
                for (int p = 0; p < size; p++) {
                    A[i + p][j + size - 1 - k] = temp[k][p];
                }
            }
        }
    }
}
 
void Melting() {
    memset(add, 0sizeof(add));
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (!A[i][j])
                continue;
            int cnt = 0;
            for (int k = 0; k < 4; k++)
                if (A[i + dy[k]][j + dx[k]])
                    cnt++;
            if (cnt < 3)
                add[i][j] = -1;
        }
    }
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            A[i][j] += add[i][j];
}
 
bool is_ok(pair<intint> next) {
    if (next.first < 1 || next.first > N || next.second < 1 || next.second > N
        || visited[next.first][next.second] || !A[next.first][next.second])
        return false;
    return true;
}
 
int BFS(pair<intint> st) {
    queue<pair<intint>> q;
    q.push(st);
    int cnt = 0;
    while (!q.empty()) {
        pair<intint> now = q.front();
        q.pop();
        if (visited[now.first][now.second])
            continue;
        visited[now.first][now.second] = true;
        cnt++;
        for (int i = 0; i < 4; i++) {
            pair<intint> next = { now.first + dy[i], now.second + dx[i] };
            if (is_ok(next))
                q.push(next);
        }
    }
    return cnt;
}
cs

๋ฌธ์ œ๋ฅผ ์ž˜๋ชป์ดํ•ดํ•ด์„œ ๊ฐ€์žฅ ํฐ ์–ผ์Œ์ด ๋“ค์–ด์žˆ๋Š” ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ธ ์ค„ ์•Œ์•˜๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•œ์ฐธ์„ ํ—ค๋งจํ›„์— ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์ฝ๊ณ  ์•Œ์•˜๋‹ค.

 

728x90