본문 바로가기
공부/알고리즘

[0611] 알고리즘

by Piva 2021. 6. 12.

2630. 색종이 만들기

  비교적 간단했던 분할 정복 문제. 나눠진 정사각형 내 모든 요소가 같지 않으면 (첫 번째 요소와 다른 요소가 한 가지라도 있다면) 다시 그 사각형을 4분할 하는 과정을 거친다.

#include <iostream>
#include <algorithm>
#include <vector>

int white = 0, blue = 0;
int paper[129][129];

void Divide(int col, int row, int side);

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

  int n; //한 변의 길이
  std::cin >> n;

  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      std::cin >> paper[i][j];
    }
  }

  Divide(0, 0, n);

  std::cout << white << '\n' << blue << '\n';

  return 0;
}

void Divide(int col, int row, int side)
{
  bool isDone = false;

  for (int i = col; i <= col + side - 1; i++)
  {
    for (int j = row; j <= row + side - 1; j++)
    {
      if (paper[col][row] != paper[i][j])
      {
        Divide(col, row, side / 2);
        Divide(col + side / 2, row, side / 2);
        Divide(col, row + side / 2, side / 2);
        Divide(col + side / 2, row + side / 2, side / 2);
        isDone = true;
        break;
      }
    }

    if (isDone) break;
  }

  if (!isDone && paper[col][row] == 1)   
    blue++;

  else if (!isDone && paper[col][row] == 0)
    white++;
}

'공부 > 알고리즘' 카테고리의 다른 글

[0614] 알고리즘  (0) 2021.06.15
[0612] 알고리즘  (0) 2021.06.13
[0608~0609] 알고리즘  (0) 2021.06.10
[0605~0606] 알고리즘  (0) 2021.06.07
[0601] 알고리즘  (0) 2021.06.01