Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 1780 종이의 개수 본문

Programming/BOJ

[백준/BOJ] 1780 종이의 개수

he1fire 2020. 9. 19. 00:08
728x90

문제 : 1780 종이의 개수

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net

종이가 모두 같은 숫자로 이루어졌는지 확인하고

만약 다른 숫자가 포함된다면 종이를 9 등분하는 것을 반복하는 문제이다.

분할 정복을 이용해 재귀 함수 코드를 작성해

시작 좌표와 가로세로 길이를 정해준 후 반복하면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, arr[2500][2500], ans[3];
void f(ll x, ll y, ll size){
    ll cnt[3]={0,};
    for (int i=x;i<x+size;i++){
        for (int j=y;j<y+size;j++){
            if (arr[i][j]==-1)
                cnt[0]++;
            if (arr[i][j]==0)
                cnt[1]++;
            if (arr[i][j]==1)
                cnt[2]++;
        }
    }
    if (cnt[0]==0 && cnt[1]==0)
        ans[2]++;
    else if (cnt[1]==0 && cnt[2]==0)
        ans[0]++;
    else if (cnt[0]==0 && cnt[2]==0)
        ans[1]++;
    else{
        ll dir[3]={0,size/3,size/3*2};
        for (int i=0;i<3;i++){
            for (int j=0;j<3;j++){
                f(x+dir[i],y+dir[j],size/3);
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            cin >> arr[i][j];
        }
    }
    f(0,0,N);
    for (auto x:ans)
        cout << x << "\n";
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 9019 DSLR  (0) 2020.09.19
[백준/BOJ] 5525 IOIOI  (0) 2020.09.19
[백준/BOJ] 1213 팰린드롬 만들기  (0) 2020.09.18
[백준/BOJ] 1531 투명  (0) 2020.09.18
[백준/BOJ] 9715 면적 구하기  (0) 2020.09.18
Comments