zoukankan      html  css  js  c++  java
  • 分形几何(递归)

    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阶段是什么

    输入描述:

    第一行  输入一个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 }
  • 相关阅读:
    房地产周期
    Vue ElementUi Excel文件和表单内容同时提交
    git从分支拉取代码到本地,并修改后提取代码到该分支
    ps学习笔记
    面试小结
    比较好的样式
    前端开发规范
    修改ElementUI源码总结
    前端学习手册
    书单
  • 原文地址:https://www.cnblogs.com/jiamian/p/11762370.html
Copyright © 2011-2022 走看看