#lydlx00x0803id2288. 分形 Fractal

分形 Fractal

盒子分形绘制问题

题目描述

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

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

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

一级盒子分形:

X

二级盒子分形:

X X
 X
X X

如果用 B(n1)B(n-1) 代表第 n1n-1 级盒子分形,那么第 nn 级盒子分形即为:

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

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

输入格式

输入包含几个测试用例。

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

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

输出格式

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

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

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

输入输出样例

输入样例

1
2
3
4
-1

输出样例

X
-
X X
 X
X X
-
X X   X X
 X     X
X X   X X
   X X
    X
   X X
X X   X X
 X     X
X X   X X
-
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
         X X   X X
          X     X
         X X   X X
            X X
             X
            X X
         X X   X X
          X     X
         X X   X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
-

限制条件

  • 1n71 \le n \le 7
  • 最后一个测试用例为 1-1,表示输入结束

分形模式分析

观察分形模式:

  • 等级1:30×303^0 \times 3^0 的矩阵,只有一个 X
  • 等级2:31×313^1 \times 3^1 的矩阵,在4个角上有等级1的分形,中心有一个 X
  • 等级3:32×323^2 \times 3^2 的矩阵,在4个角上有等级2的分形,中心有一个等级1的分形
  • 等级n:3n1×3n13^{n-1} \times 3^{n-1} 的矩阵

具体来说,等级 nn 的分形可以看作:

  1. 一个 3n1×3n13^{n-1} \times 3^{n-1} 的网格
  2. 在网格的四个角放置等级 n1n-1 的分形
  3. 在网格的中心放置等级 n1n-1 的分形
  4. 其他地方用空格填充

实现方法

可以使用递归或递推的方法:

  1. 先计算等级 nn 的分形尺寸:size=3n1size = 3^{n-1}
  2. 初始化一个 size×sizesize \times size 的字符数组,填充为空格
  3. 递归地在指定位置绘制子分形
  4. 对于等级1,直接在中心位置放置 X
  5. 对于等级 nn (n>1n>1),在5个位置递归绘制等级 n1n-1 的分形:
    • 左上角:(0,0)(0, 0)
    • 右上角:(0,2×3n2)(0, 2 \times 3^{n-2})
    • 中心:(3n2,3n2)(3^{n-2}, 3^{n-2})
    • 左下角:(2×3n2,0)(2 \times 3^{n-2}, 0)
    • 右下角:(2×3n2,2×3n2)(2 \times 3^{n-2}, 2 \times 3^{n-2})