分形

分形,具有以非整数维形式充填空间的形态特征。

通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

现在,定义“盒子分形”如下:

一级盒子分形:

1
X

二级盒子分形:

1
2
3
X X
X
X X

如果用 $B(n−1)$ 代表第 $n−1$ 级盒子分形,那么第 $n$ 级盒子分形即为:

1
2
3
4
5
B(n - 1)        B(n - 1)

B(n - 1)

B(n - 1) B(n - 1)

你的任务是绘制一个 $n$ 级的盒子分形。

输入格式

输入包含几个测试用例。

输入的每一行包含一个不大于 $7$ 的正整数 $n$,代表要输出的盒子分形的等级。

输入的最后一行为 $−1$,代表输入结束。

输出格式

对于每个测试用例,使用 X 符号输出对应等级的盒子分形。

请注意 X 是一个大写字母。

每个测试用例后输出一个独立一行的短划线。

输入样例:

1
2
3
4
5
1
2
3
4
-1

输出样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
X
-
X X
X
X X
-
X X X X
X X
X X X X
X X
X
X X
X X X X
X X
X X X X
-
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X
X
X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
-

题目解析

分形之城 的同类型缩水题,这道题没有旋转之类的操作,就是简单的变更位置(是否应该交换一下这两道题的位置?),和分形之城同样的处理,只不过这里我用的递推,直接在上一级图形的基础上进行移动即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <cmath>
#include <cstdio>
#include <cstring>

const int N = 2005;
int c[N][N];

int main() {
int n;
while(scanf("%d", &n)) {
if(n == -1) break;
memset(c, 0, sizeof(c));
c[1][1] = 1; c[1][3] = 1;
c[2][2] = 1; c[3][1] = 1;
c[3][3] = 1;

if(n == 1) puts("X");
else if(n == 2) {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if(c[i][j] == 0) {
printf(" ");
} else {
printf("X");
}
} puts("");
}
} else {
for (int k = 3; k <= n; k++) {
//自己数格子 看看每级占多长的长度
int len = pow(3, k - 2);
int len1 = pow(3, k - 1) - len;
for (int i = 1; i <= len; i++) {
for (int j = 1; j <= len; j++) {
c[i][j + len1] = c[i][j]; //向右移动
c[i + len][j + len] = c[i][j]; //向中移动
c[i + len1][j] = c[i][j]; //向下移动
c[i + len1][j + len1] = c[i][j]; //向右下移动
}
}
}

int len = pow(3, n - 1);
for (int i = 1; i <= len; i++) {
for (int j = 1; j <= len; j++) {
if(c[i][j] == 0) printf(" ");
else printf("X");
} puts("");
}
} puts("-");
} return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!