Algorithm

BOJ 1074 c++

최강훈 2020. 7. 13. 19:03

백준 1074 Z c++

 

재귀 문제.

 

(half, half)를 기준으로 1, 2, 3 ,4 분면으로 나눌 수 있음.

1->2->3->4 분면 순서대로 방문함.

 

half는 2의 n - 1승(사각형의 한 변)을 의미.

2사분면은 half * half + 1사분면에 있을 경우의 위치.

3사분면은 2 * half * half + 1사분면에 있을 경우의 위치.

4사분면은 3 * half * half + 1사분면에 있을 경우의 위치.

 

#include <bits/stdc++.h>
using namespace std;
int n, r, c;

int z(int n, int r, int c) {
    if (n == 0)
        return 0;
    int half = 1 << (n - 1);
    if (r < half && c < half)
        return z(n - 1, r, c);
    else if (r < half && c >= half)
        return half * half + z(n - 1, r, c - half);
    else if (r >= half && c < half)
        return 2 * half * half + z(n - 1, r - half, c);
    else
        return 3 * half * half + z(n - 1, r - half, c - half);
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> r >> c;
    cout << z(n, r, c);
    return 0;
}