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


一个分形块可以定义为如下内容:
X
X X
X
X X
- 如果用B(n-1)表示度数为n-1的分形块,那么度数为n的分形块可以递归地定义为如下形式:
B(n - 1) B(n - 1)
B(n - 1)
B(n - 1) B(n - 1)
你的任务是绘制一个度数为n的分形块!
输入包括多个测试样例,每个测试样例是一个不超过7的正整数,以-1表示输入结束。
对于每一个测试样例,用大写字母‘X’表示分形盒子中的元素,按照度数要求输出分形块。每一个分形块输出结束后用破折号‘-’分隔。
!输出数据中每行后面均有以空格符。注意输出格式控制!
1 #include <stdio.h>
2 #include <string.h>
3 #include <iostream>
4 #include <string>
5 #include <math.h>
6 #include <algorithm>
7 #include <vector>
8 #include <stack>
9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 //const double PI=acos(-1);
17 #define Bug cout<<"---------------------"<<endl
18 const int maxn=1e5+10;
19 using namespace std;
20
21 void PT(int n)//输出n个空格
22 {
23 for(int i=0;i<n;i++)
24 printf(" ");
25 }
26
27 void F(int n,int L,int flag)//n为度数,L为层数,flag为1代表左边(要填充),flag为0代表右边
28 {
29 if(n==1)
30 printf("X");
31 else
32 {
33 if(L<=pow(3,n-1)/3)
34 {
35 if(flag)
36 F(n-1,L,flag);
37 else
38 F(n-1,L,!flag);
39 PT(pow(3,n-2));
40 F(n-1,L,flag);
41 }
42 else if(L<=2*pow(3,n-1)/3)
43 {
44 PT(pow(3,n-2));
45 F(n-1,L%(int)(pow(3,n-1)/3),flag);
46 if(flag)
47 PT(pow(3,n-2));
48 }
49 else
50 {
51 if(flag)
52 F(n-1,L%(int)(pow(3,n-1)/3),flag);
53 else
54 F(n-1,L%(int)(pow(3,n-1)/3),!flag);
55 PT(pow(3,n-2));
56 F(n-1,L%(int)(pow(3,n-1)/3),flag);
57 }
58 }
59 }
60
61 void Solve(int n)
62 {
63 if(n==1)
64 {
65 printf("X");
66 return ;
67 }
68 for(int i=1;i<=pow(3,n-1)/3;i++)
69 {
70 F(n-1,i,1);
71 PT(pow(3,n-2));
72 F(n-1,i,0);
73 printf("\n");
74 }
75 for(int i=1;i<=pow(3,n-1)/3;i++)
76 {
77 PT(pow(3,n-2));
78 F(n-1,i,0);
79 printf("\n");
80 }
81 for(int i=1;i<=pow(3,n-1)/3;i++)
82 {
83 F(n-1,i,1);
84 PT(pow(3,n-2));
85 F(n-1,i,0);
86 printf("\n");
87 }
88 }
89
90 int main()
91 {
92 int n;
93 while(~scanf("%d",&n)&&n!=-1)
94 {
95 if(n==1)
96 printf("X\n");
97 else Solve(n);
98 printf("-\n");
99 }
100 return 0;
101 }