Programming/BOJ

[백준/BOJ] 1074 Z

he1fire 2020. 11. 29. 00:59
728x90

문제 : 1074 Z

 

1074번: Z

한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원

www.acmicpc.net

2차원 배열을 Z자 모양으로 순회 헸을 때

주어진 좌표를 몇 번째로 방문하는지 출력하는 문제이다.

x, y좌표의 기준과 현재 나눌 정사각형의 한 변의 길이를 정보로 주고

분할 정복을 이용해 해결하면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, r, c;
ll f(ll x, ll y, ll len){
    if (len==0) 
        return 0;
    if (r<x && c<y)
        return f(x-len/2,y-len/2,len/2);
    else if (r<x && c>=y)
        return pow(len,2)+f(x-len/2,y+len/2,len/2);
    else if (r>=x && c<y)
        return pow(len,2)*2+f(x+len/2,y-len/2,len/2);
    else if (r>=x && c>=y)
        return pow(len,2)*3+f(x+len/2,y+len/2,len/2);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> r >> c;
    cout << f(1<<N, 1<<N, 1<<N);
    return 0;
}
728x90