BJ1074 Z


https://www.acmicpc.net/problem/1074

問題は解決しにくいように見えるが,再帰関数実装を用いることで,想像以上に簡単なコードで解決できる.
R行C列を入力すると、最大Zのどの部分を検索して加算します.
一歩一歩小さなZに下がって、この過程を繰り返すだけでいいです.
package day0215;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Z {
	static BufferedReader br;
	static BufferedWriter bw;
	static StringTokenizer st;

	static int find(int level, int x, int y, int out) {
		if (level == 0)
			return out;
		int N = (int) Math.pow(2, level);
		if (x >= N / 2) {
			out += N * N / 2;
			x -= N / 2;
		}
		if (y >= N / 2) {
			out += N * N / 4;
			y -= N / 2;
		}
		return find(level - 1, x, y, out);
	}

	public static void main(String[] args) throws IOException {
		br = new BufferedReader(new InputStreamReader(System.in));
		bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int N, R, C; // 행과 열을 담을 예정.
		st = new StringTokenizer(br.readLine(), " ");
		
		N = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		
		System.out.println(find(N, R, C, 0));
	}
}