Description
分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
一个分形块可以定义为如下内容:
- 度数为1的分形块表示为:
X
- 度数为2的分形块表示为:
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的分形块!
Input
输入包括多个测试样例,每个测试样例是一个不超过7的正整数,以-1表示输入结束。
Output
对于每一个测试样例,用大写字母‘X’表示分形盒子中的元素,按照度数要求输出分形块。每一个分形块输出结束后用破折号‘-’分隔。
Sample Input
1 2 3 4 -1
Sample Output
X - X X X X X - X X X X X X X X X X X X X X X X X X X X X X X X X - X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X -
HINT
!输出数据中每行后面均有以空格符。注意输出格式控制!
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(" "); 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(" "); 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(" "); 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 "); 97 else Solve(n); 98 printf("- "); 99 } 100 return 0; 101 }
类似题:
有一天小李爸爸老李送了个积木给小李玩,积木里面就分两种,黑白方块,老李给了小李一个任务,这里给出图形堆的规则
第一阶段
1
第二阶段
1 1
0 1
第三阶段
1 1 1 1
0 1 0 1
0 0 1 1
1 0 0 1
. . .等
规则是:
分为四个部分
1 | 1
——
0 | 1
左1 右1 右2 都是和 n-1阶段相同
左2 和 n-1阶段相反
然后老李想要知道第n阶段是什么
第一阶段
1
第二阶段
1 1
0 1
第三阶段
1 1 1 1
0 1 0 1
0 0 1 1
1 0 0 1
. . .等
规则是:
分为四个部分
1 | 1
——
0 | 1
左1 右1 右2 都是和 n-1阶段相同
左2 和 n-1阶段相反
然后老李想要知道第n阶段是什么
输入描述:
第一行 输入一个t,代表数据组数(1<=t<=10)
第二行 输入一个n,代表要求第n阶段是什么(1<=n<=10)
输出描述:
下面t组数据,分别输出第n阶段的积木堆的情况
示例1
输入
3 1 2 3
输出
1 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 1
代码如下:
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() 22 { 23 printf(" "); 24 } 25 26 void F(int n,int L,int flag) 27 { 28 if(n==1) 29 { 30 if(flag) printf("1"); 31 else printf("0"); 32 return ; 33 } 34 if(L<=pow(2,n-1)/2) 35 { 36 F(n-1,L,flag);PT();F(n-1,L,flag); 37 } 38 else 39 { 40 F(n-1,L-(int)(pow(2,n-1)/2),!flag);PT();F(n-1,L-(int)(pow(2,n-1)/2),flag); 41 } 42 } 43 44 void Solve(int n) 45 { 46 for(int i=1;i<=pow(2,n-1)/2;i++) 47 { 48 F(n-1,i,1);PT();F(n-1,i,1); 49 printf(" "); 50 } 51 for(int i=1;i<=pow(2,n-1)/2;i++) 52 { 53 F(n-1,i,0);PT();F(n-1,i,1); 54 printf(" "); 55 } 56 } 57 58 int main() 59 { 60 int T; 61 scanf("%d",&T); 62 while(T--) 63 { 64 int n; 65 scanf("%d",&n); 66 if(n==1) 67 printf("1 "); 68 else Solve(n); 69 } 70 }
队友用string写的
1 //MADE BY Y_is_sunshine; 2 //#include <bits/stdc++.h> 3 //#include <memory.h> 4 #include <algorithm> 5 #include <iostream> 6 #include <cstdlib> 7 #include <cstring> 8 #include <sstream> 9 #include <cstdio> 10 #include <vector> 11 #include <string> 12 #include <cmath> 13 #include <queue> 14 #include <stack> 15 #include <map> 16 #include <set> 17 18 #define INF 0x3f3f3f3f 19 #define MAXN 200005 20 21 typedef long long ll; 22 23 const int mod = 998244353; 24 const double PI = acos(-1); 25 26 using namespace std; 27 28 int N, M, K; 29 30 int main(void) 31 { 32 //freopen("data.txt", "r", stdin); 33 34 ios_base::sync_with_stdio(false); 35 cin.tie(NULL); 36 37 //cout << (2 << 9) << endl; 38 39 int T; 40 cin >> T; 41 while (T--) { 42 string s[1050]; 43 int cnt = 1; 44 s[1] = "1"; 45 cin >> N; 46 while (--N) { 47 for (int i = 1; i <= cnt; i++) { 48 //s[i + cnt] = s[i], s[i + cnt].reserve(); 49 for (auto it1 : s[i]) 50 s[i + cnt] += it1 == '1' ? '0' : '1'; 51 } 52 for (int i = 1; i <= cnt; i++) 53 s[i + cnt] += s[i]; 54 for (int i = 1; i <= cnt; i++) 55 s[i] += s[i]; 56 cnt *= 2; 57 } 58 59 /*for (int i = 1; i <= cnt; i++) 60 cout << s[i] << ' ';*/ 61 for (int i = 1; i <= cnt; i++) { 62 for (int j = 0; j < s[i].size(); j++) 63 cout << s[i][j] << (j == s[i].size() - 1 ? ' ' : ' '); 64 } 65 66 } 67 68 69 70 71 //freopen("CON", "r", stdin); 72 //system("pause"); 73 return 0; 74 }