1074번: Z
https://www.acmicpc.net/problem/1074
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;
int Row, Col;
int Answer;
void Solve(int X, int Y, int N)
{
if (X == Row && Y == Col)
{
cout << Answer << '\n';
return;
}
if (Row < X + N && Row >= X && Col < Y + N && Col >= Y)
{
Solve(X, Y, N / 2);
Solve(X, Y + (N / 2), N / 2);
Solve(X + (N / 2), Y, N / 2);
Solve(X + (N / 2), Y + (N / 2), N / 2);
}
else Answer += (N * N);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N >> Row >> Col;
Solve(0, 0, (1 << N));
return 0;
}
2630번: 색종이 만들기
https://www.acmicpc.net/problem/2630
- Board[x][y]가 1(=파란색)일 때의
NumBlue
를 체크한다.
NumBlue
가 0이면(=전체 흰색) ++ResWhite
, N * N
개면(=전체 파란색) ++ResBlue
- 둘 다 아니면, 분할한다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;
int Board[129][129];
int ResWhite, ResBlue;
void Solve(int X, int Y, int N)
{
int NumBlue{};
for (int i = X; i < X + N; ++i)
{
for (int j = Y; j < Y + N; ++j)
{
if (1 == Board[i][j])
{
++NumBlue;
}
}
}
if (NumBlue == 0)
{
++ResWhite;
}
else if (NumBlue == N * N)
{
++ResBlue;
}
else
{
Solve(X, Y, (N / 2));
Solve(X + (N / 2), Y, (N / 2));
Solve(X, Y + (N / 2), (N / 2));
Solve(X + (N / 2), Y + (N / 2), (N / 2));
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
cin >> Board[i][j];
}
}
Solve(0, 0, N);
cout << ResWhite << endl << ResBlue;
return 0;
}