1
+ import java .io .BufferedReader ;
2
+ import java .io .InputStreamReader ;
3
+ import java .util .StringTokenizer ;
4
+
5
+ public class JW_1030 {
6
+
7
+ static int s , n , k , r1 , r2 , c1 , c2 ;
8
+ static boolean [][] board ;
9
+
10
+ public static void main (String [] args ) throws Exception {
11
+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
12
+ StringTokenizer st = new StringTokenizer (br .readLine ());
13
+ s = Integer .parseInt (st .nextToken ());
14
+ n = Integer .parseInt (st .nextToken ());
15
+ k = Integer .parseInt (st .nextToken ());
16
+ r1 = Integer .parseInt (st .nextToken ());
17
+ r2 = Integer .parseInt (st .nextToken ());
18
+ c1 = Integer .parseInt (st .nextToken ());
19
+ c2 = Integer .parseInt (st .nextToken ());
20
+ board = new boolean [r2 - r1 + 1 ][c2 - c1 + 1 ];
21
+ makeBoard (s , 0 , 0 , false );
22
+ StringBuilder sb = new StringBuilder ();
23
+ for (int i = 0 ; i < board .length ; i ++) {
24
+ for (int j = 0 ; j < board [i ].length ; j ++)
25
+ if (board [i ][j ])
26
+ sb .append ("1" );
27
+ else
28
+ sb .append ("0" );
29
+ sb .append ("\n " );
30
+ }
31
+ System .out .println (sb );
32
+ }
33
+
34
+ // 분할 정복으로 검은색 타일 채우기
35
+ private static void makeBoard (int depth , int y , int x , boolean tile ) {
36
+ int len = (int ) Math .pow (n , depth ); // 그리드의 길이
37
+ // 확인하지 않아도 되는 그리드라면 스킵
38
+ if (isNotOverlap (y , x , len )) {
39
+ return ;
40
+ }
41
+ // 재귀 종료 조건
42
+ if (depth == 0 ) {
43
+ board [y - r1 ][x - c1 ] = tile ; // true = 검은색 타일
44
+ return ;
45
+ }
46
+ int sLen = len / n ; // 서브그리드의 길이
47
+ int bsy = y + sLen * (n - k ) / 2 , bsx = x + sLen * (n - k ) / 2 ; // 검은색 타일이 시작하는 좌표
48
+ int bLen = sLen * k ; // 검은색 타일의 길이
49
+ // 서브 그리드별로 확인
50
+ for (int i = y ; i < y + len ; i += sLen ) {
51
+ for (int j = x ; j < x + len ; j += sLen ) {
52
+ makeBoard (depth - 1 , i , j , tile | isBlack (bsy , bsx , bLen , i , j )); // 다음 재귀 진행, 검은색 타일 체크
53
+ }
54
+ }
55
+ }
56
+
57
+ // 유효한 그리드인지 체크
58
+ private static boolean isNotOverlap (int y , int x , int len ) {
59
+ return y + len <= r1 || y > r2 || x + len <= c1 || x > c2 ;
60
+ }
61
+
62
+ // 검은색 타일 체크
63
+ private static boolean isBlack (int bsy , int bsx , int bLen , int y , int x ) {
64
+ return bsy <= y && y < bsy + bLen && bsx <= x && x < bsx + bLen ;
65
+ }
66
+ }
0 commit comments