分类
Level9

分形

分形——通常被定义为一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。
例如,雪花、晶体、西蓝花、弯弯曲曲的海岸线、起伏不平的山脉、粗糙不堪的断面、变幻无常的浮云、九曲回肠的河流、纵横交错的血管、令人眼花缭乱的满天繁星,等等——它们的特点都是,极不规则,或极不光滑,直观而粗略地说,这些对象都是分形。

事实上,大自然中的一切,从本质上来看都是分形结构——它们杂乱无章、富含细节,但遵循一定的模式——尤其是树形结构,它体现了典型的自相似性分形结构。

分形实例1:

#include<bits/stdc++.h>
using namespace std;
char a[1005][1005],x;/**< 数组大小根据题意范围设定 */
int m;
void f(int n){
    if(n==1){
        a[1][1]='X';return ;
    }
    f(n-1);/**< 先构造n-1图形 */
    int len=(int)pow(3,n-2);
    for(int i=1;i<=len;i++) 
        for(int j=1;j<=len;j++) /**< 复制4份 */
            a[i][j+2*len]=a[i+len][j+len]=a[i+2*len][j]=a[i+2*len][j+2*len]=a[i][j];
}
int main(){
    memset(a,' ',sizeof(a));
    cin>>m;
    f(m);
    for(int i=1;i<=(int)(pow(3,m-1));i++){
        for(int j=1;j<=(int)(pow(3,m-1));j++)
            cout<<a[i][j];
        cout<<endl;
    }
    return 0;
}

分形实例2:

#include <bits/stdc++.h>
using namespace std;
char a[1025][2048];
int f(int n){ 
    if(n==1){ /**< 1级图形只能手敲 */
        a[1][1]=' ';
        a[1][2]='/';
        a[1][3]='\\';
        a[1][4]=' ';
        a[2][1]='/';
        a[2][2]='_';
        a[2][3]='_';
        a[2][4]='\\';
        return 0;
    }
    f(n-1);//先构造小一号的图形
    int x=pow(2,n-1),y=pow(2,n);//小一号的图形行列数
    for(int i=x+1;i<=2*x;i++)//先把f(n-1)的图形复制到下面,如上
        for(int j=1;j<=y;j++)
            a[i][j]=a[i][j+y]=a[i-x][j];
    for(int i=1;i<=x;i++) //最上面那个f(n-1)平移y/2个单位
        for(int j=y;j>=1;j--)
            a[i][j+y/2]=a[i][j],a[i][j]=' ';
}
int n;
int main(){
    memset(a,' ',sizeof(a));
    cin>>n;
    f(n);
    int x=pow(2,n),y=pow(2,n+1);
    for(int i=1;i<=x;i++){
        for(int j=1;j<=y;j++)
            cout<<a[i][j];
        cout<<endl;
    }
    return 0;
}