分形,具有以非整数维形式充填空间的形态特征。
通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
现在,定义“盒子分形”如下:
一级盒子分形:
二级盒子分形:
如果用 $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 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 ; }