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 }
  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/jiamian/p/11762370.html
Copyright © 2011-2022 走看看