[伯俊]BOJ 1992四叉木JAVA
14260 ワード
BOJ 1992四叉木
白黒ビデオを圧縮することによって表現されるデータ構造である四叉木(Quad Tree)と呼ばれる方法がある.白点を表す0と黒点を表す1からなるビデオ(二次元配列)では、同じ数字の点が一つの場所に集中すると、四叉木で圧縮して簡単に表現できる.
指定されたビデオがすべて0の場合、圧縮結果は「0」、すべてが1の場合、圧縮結果は「1」です.0と1が混在していると、一度に領域全体を表示するのではなく、左上、右上、左下、右下の4つのビデオに分けて圧縮し、この4つの領域の圧縮結果を括弧で囲んで表示します
上図では、左側のビデオは右側の配列のように数字で与えられ、このビデオを四叉木構造で圧縮すると「(0(0011)(0(0111)01)1」と表される.N ×Nサイズのビデオがある場合は、圧縮した結果を出力するプログラムを作成します.
1行目には、画像サイズを表す数字Nが与えられる.Nは常に2の平方数で与えられ,1≦N≦64の範囲である.2行目から、N個の長さの文字列があります.各文字列は0または1の数字で構成され、画像内の各点を表します.
圧縮ビデオの結果を出力します.
分期征服問題が多ければ多いほど、感じがします.△復帰問題は解決しなければ分からない.
質問する
白黒ビデオを圧縮することによって表現されるデータ構造である四叉木(Quad Tree)と呼ばれる方法がある.白点を表す0と黒点を表す1からなるビデオ(二次元配列)では、同じ数字の点が一つの場所に集中すると、四叉木で圧縮して簡単に表現できる.
指定されたビデオがすべて0の場合、圧縮結果は「0」、すべてが1の場合、圧縮結果は「1」です.0と1が混在していると、一度に領域全体を表示するのではなく、左上、右上、左下、右下の4つのビデオに分けて圧縮し、この4つの領域の圧縮結果を括弧で囲んで表示します
上図では、左側のビデオは右側の配列のように数字で与えられ、このビデオを四叉木構造で圧縮すると「(0(0011)(0(0111)01)1」と表される.N ×Nサイズのビデオがある場合は、圧縮した結果を出力するプログラムを作成します.
入力
1行目には、画像サイズを表す数字Nが与えられる.Nは常に2の平方数で与えられ,1≦N≦64の範囲である.2行目から、N個の長さの文字列があります.各文字列は0または1の数字で構成され、画像内の各点を表します.
しゅつりょく
圧縮ビデオの結果を出力します.
サンプルI/O
ソースコード
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private static int n;
private static int[][] map;
private static StringBuilder sb;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
map = new int[n][n];
sb = new StringBuilder();
for (int i = 0; i < n; i++) {
String str = br.readLine();
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(String.valueOf(str.charAt(j)));
}
}
getQuadTree(0, 0, n);
System.out.println(sb.toString());
}
private static void getQuadTree(int row, int col, int size) {
if (check(row, col, size)) {
sb.append(map[row][col]);
} else {
sb.append("(");
int half = size / 2;
/*getQuadTree(row, col, half);
getQuadTree(row, col + half, half);
getQuadTree(row + half, col, half);
getQuadTree(row + half, col + half, half);*/
for (int i = row; i <= row + half; i += half) {
for (int j = col; j <= col + half; j += half) {
getQuadTree(i, j, half);
}
}
sb.append(")");
}
}
private static boolean check(int row, int col, int size) {
int temp = map[row][col];
for (int i = row; i < row + size; i++) {
for (int j = col; j < col + size; j++) {
if (temp != map[i][j]) {
return false;
}
}
}
return true;
}
}
Comment
Reference
この問題について([伯俊]BOJ 1992四叉木JAVA), 我々は、より多くの情報をここで見つけました https://velog.io/@jinmin2216/백준-BOJ1992-쿼드-트리-JAVAテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol