1074번 Z는 문제의 모양부터 분할 정복을 사용하라는 힌트를 주는 것이었는데 , 수식적으로 접근하려다 오히려 시간을 낭비했다.
항상 4사분면 형태로 필드가 증식되는것을 생각한다면 게임판을 줄여가며 해당하는 값을 더해주기만 해도 쉽게 풀린다.
# include <iostream>
# include <math.h>
using namespace std;
int main() {
int N , r , c;
cin >> N >> r >> c;
int bound = 0;
int cnt = 0;
while (N >= 1) {
if (r > pow(2, N - 1) - 1 && c > pow(2, N - 1) - 1)
{
bound = 3;
r -= pow(2, N - 1) ;
c -= pow(2, N - 1) ;
}
else if (r > pow(2, N - 1) - 1 && c <= pow(2, N - 1) - 1)
{
bound = 2;
r -= pow(2, N - 1) ;
}
else if (r <= pow(2, N - 1) - 1 && c > pow(2, N - 1) - 1)
{
bound = 1;
c -= pow(2, N - 1) ;
}
else if (r <= pow(2, N - 1) - 1 && c <= pow(2, N - 1) - 1) bound = 0;
int q = bound * pow(4, N - 1);
cnt += bound * pow(4, N - 1);
N -= 1;
}
cout << cnt;
return 0;
}
또한 유의해야 할점은, 이런 방식으로 풀게되면 꼭 경계를 다시 설정해야 한다는 것이다. 문제의 크기가 바뀌었으니 r , c도 바꿔줘야 한다.