分形几何(递归)

分形几何(递归)

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("\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 }

 

 

 

类似题:

有一天小李爸爸老李送了个积木给小李玩,积木里面就分两种,黑白方块,老李给了小李一个任务,这里给出图形堆的规则
第一阶段
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("\n");
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("\n");
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\n");
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] << '\n';*/
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 ? '\n' : ' ');
64         }
65  
66     }
67      
68  
69  
70  
71     //freopen("CON", "r", stdin);
72     //system("pause");
73     return 0;
74 }
posted @ 2019-10-29 23:32  jiamian22  阅读(1842)  评论(0编辑  收藏  举报