#BOJ 1074 Z


Z

시간 제한	메모리 제한	제출	정답	맞힌 사람	정답 비율
0.5 초 (추가 시간 없음)	512 MB	39739	13664	10233	36.946%
質問する
1つの数の大きさは2 Nです× 2 Nの2次元配列をZ形状として探索する.たとえば、2×2左上、右上、左下、右下の順にアクセスしてZ形に並べます.

N>1の場合、アレイサイズは2 N-1× 2 N−1,4は等分後に再帰的にアクセスする.
次の例は22です.× アクセス22のサイズ配列の順序です.

Nが与えられた場合、プログラムを記述し、r行c列に何回目のアクセスを出力する.
以下に、N=3の場合の例を示す.

入力
第1行は整数N,r,cを与える.
しゅつりょく
数回目のアクセスr行c列を出力します.
制限
1 ≤ N ≤ 15
0 ≤ r, c < 2N
入力例1
2 3 1
サンプル出力1
11
入力例2
3 7 7
サンプル出力2
63
入力例3
1 0 0
サンプル出力3
0
入力例4
4 7 7
サンプル出力4
63
入力例5
10 511 511
サンプル出力5
262143
入力例6
10 512 512
サンプル出力6
786432

インプリメンテーション

#include <bits/stdc++.h>
using namespace std;

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

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

	
	return 0;

}