《算法竞赛进阶指南》分形

《算法竞赛进阶指南》分形

分形,具有以非整数维形式充填空间的形态特征。

通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

现在,定义“盒子分形”如下:

一级盒子分形:

X
二级盒子分形:

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级的盒子分形。

输入格式
输入包含几个测试用例。

输入的每一行包含一个不大于7的正整数n,代表要输出的盒子分形的等级。

输入的最后一行为-1,代表输入结束。

输出格式
对于每个测试用例,使用“X”符号输出对应等级的盒子分形。

请注意’X’是一个大写字母。

每个测试用例后输出一个独立一行的短划线。

#include<iostream>
using namespace std;
const int maxn=3000+10;
char a[maxn][maxn];//本题用一个二维数组存储1~7级分形的所有情况
int sx[4]={0,1,2,2},sy[4]={2,1,0,2};//存储每一个要复制到的位置分别乘以边长之后就是要复制之后的位置
int n;
void dfs(int k)
{  //我们依据的思想是每一次分形都将左上角的图形复制到其余四个位置
//在复制时len的长度是k-1次分形的长度        
if(k==1)
{
        a[1][1]='X';
        return;
}
    dfs(k-1);
    int len=1;
    for(int i=1;i<=k-2;i++)
    len*=3;
    //下面要依据要扫描要复制的位置然后复制到四个位置上去
     for(int i=1;i<=len;i++)
     {
             for(int j=1;j<=len;j++)
             {
                     for(int q=0;q<4;q++)
                     a[i+len*sx[q]][j+len*sy[q]]=a[i][j];
             }
     }
        return;
}
int main(){
         dfs(7);
        while(cin>>n&&n!=-1)
        {
                int sum=1;
                for(int i=1;i<=n-1;i++)
                sum*=3;  //当是第n级分形时,它的边长是3^(n-1)
                for(int i=1;i<=sum;i++)
                {
                        for(int j=1;j<=sum;j++)
                        if(a[i][j])cout<<a[i][j];
                        else cout<<" ";
                        cout<<endl;
                }
                cout<<"-"<<endl;
        }
        return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值