ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2630] 색종이 만들기
    백준/완전탐색 and 분할정복 2024. 1. 12. 11:19

    이분탐색 풀다 완탐 풀고 싶어서 오랜만에 완탐 문제 풀어봄

     

    그냥 한 정사각형 색종이가 만들어질때까지만 재귀를 돌려주면 된다

     


    #include <iostream>
    
    using namespace std;
    
    int** board;
    int white, blue;
    
    bool check(int starty, int startx, int size) {
    	int flag;
    	if (board[starty][startx] == 1) flag = 1; // blue
    	else flag = 0; // white
    
    	for (int y = starty; y < starty + size; y++) {
    		for (int x = startx; x < startx + size; x++) {
    			// 파란색인데 흰색 나오거나
    			if (flag && board[y][x] == 0) return false;
    			// 흰색인데 파란색나오면
    			if (!flag && board[y][x] == 1) return false;
    		}
    	}
    
    	if (flag) blue++;
    	else white++;
    
    	return true;
    }
    
    void solve(int starty, int startx, int size) {
    
    	// 다 같은 수로 채워져있으면
    	if (check(starty, startx, size)) return;
    
    	int newsize = size / 2;
    	solve(starty, startx, newsize);
    	solve(starty + newsize, startx, newsize);
    	solve(starty, startx + newsize, newsize);
    	solve(starty + newsize, startx + newsize, newsize);
    
    	return;
    }
    
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0); cout.tie(0);
    
    	int N; cin >> N;
    	
    	board = new int*[N];
    	for (int i = 0; i < N; i++) {
    		board[i] = new int[N];
    	}
    
    	for (int i = 0; i < N; i++) {
    		for (int k = 0; k < N; k++) {
    			cin >> board[i][k];
    		}
    	}
    
    	solve(0, 0, N);
    
    	cout << white << "\n";
    	cout << blue;
    
    	return 0;
    }

    '백준 > 완전탐색 and 분할정복' 카테고리의 다른 글

    [백준 1074] Z  (0) 2024.01.13
    [백준 2531] 회전 초밥  (0) 2023.03.26
    [백준 16974] 레벨 햄버거  (0) 2023.03.24
    [백준 1780] 종이의 개수  (0) 2023.03.10
    [백준 14601] 샤워실 바닥 깔기 (Large)  (1) 2023.03.10