白駿2630号)色紙を作る


質問する
下図1に示すように、正方形の格子からなる正方形紙が複数あり、各正方形は白または青に塗られている.与えられた紙を一定の規則に従って様々な大きさの正方形の白色または青色の紙に切る.
全紙サイズN×N(N=2 k,kは1以上7以下の自然数)の場合、切り紙のルールは以下の通りです.
用紙全体に同じ色が塗られていない場合は、<図2>のI,II,III,IVのように、中央部分を横方向と縦方向にカットしてください.× n/2は色紙に分かれている.分割された用紙I,II,III,IVについては,前のようにすべて同じ色を塗らなければ,同じ方法で同じ大きさの4つのカラー紙に分けられる.この過程を繰り返して、紙を全部白や青に塗ったり、正方形の格子になったりして、これ以上裁断できないまで繰り返します.
上記のルールに従って裁断する場合、『図3』は『図1』の用紙が1回目に分割された状態を示し、『図4』は2回目に分割された状態を示し、『図5』は最終的に作られた9枚の異なる大きさの白い用紙と7枚の青い紙を示した.
所定の用紙の長さNと各正方形のセルの色(白または青)を入力すると、カットされた白と青の用紙の個数を計算するプログラムを作成します.
入力
1行目は紙全体の片側長Nがある.Nは、2、4、8、16、32、64、128のうちの1つである.色紙の各横線の正方形の格子の色は、上から2行目から最後の行まで順番に変わります.白い格子は0で、青い格子は1で、数字の間にスペースがあります.
しゅつりょく
1行目はカットされた白い紙の個数、2行目は青い紙の個数を出力します.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static StringBuilder builder = new StringBuilder();
	public static int white = 0;
	public static int blue = 0;
	public static String[][] board;

	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(reader.readLine());
		StringTokenizer tokenizer;
		board = new String[N][N];
		for (int i = 0; i < N; i++) {
			// tokenizer = new StringTokenizer(reader.readLine());
			board[i] = reader.readLine().split(" ");
		}
		partition(0, 0, N);

		System.out.println(white);
		System.out.println(blue);
	}

	public static void partition(int row, int col, int size) {
		//

		if(colorCheck(row, col, size)) {
			if(board[row][col].equals("0")) {
				white++;
			}
			else {
				blue++;
			}
			return;
		}

		int newSize = size / 2;	// 절반 사이즈
		// 재귀 호출
		System.out.println(row+" : "+col+" : "+newSize);
		partition(row, col, newSize);						// 2사분면
		partition(row, col + newSize, newSize);				// 1사분면
		partition(row + newSize, col, newSize);				// 3사분면
		partition(row + newSize, col + newSize, newSize);	// 4사분면

	}

	public static boolean colorCheck(int row, int col, int size) {

		String color =  board[row][col];
		for (int i = row; i < row + size; i++) {
			for (int j = col; j < col + size; j++) {
				if (!board[i][j] .equals(color)) {
					return false;
				}
			}
		}
		return true;
	}
}