AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 118. 分形    原题链接    中等

作者: 作者的头像   秦淮岸灯火阑珊 ,  2019-01-21 10:10:56 ,  所有人可见 ,  阅读 3956


19


5

原题连接

题目描述

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

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

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

一级盒子分形:

   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’是一个大写字母。

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


样例

输入样例:
1
2
3
4
-1
输出样例
X
-
X X
 X
X X
-
X X   X X
 X     X
X X   X X
   X X
    X
   X X
X X   X X
 X     X
X X   X X
-
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
         X X   X X
          X     X
         X X   X X
            X X
             X
            X X
         X X   X X
          X     X
         X X   X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
-

模拟+递归

解题思路:
  1. 这道题目思维难度不是很大,我们主要是要看清题目的输出格式,其实当$n>1$的时候,每一个输出,都可以看作成为九宫格。
  2. 接着我们可以注意一下每两个$X$之间的空格,就可以发现一定的规律。
  3. 这道题目可以不用递归做,但是用递归做非常的简便。然而我还是用了一个半小时
    分形.png

C++ 代码

注释版本
#include <bits/stdc++.h>
using namespace std;
int rc[730][730],n,i,j;
int power(int a,int b)//快速幂,虽然可以不用,但是多打一打还是很有益处的。
{
    if (b==0)
        return 1;
    int ans=1;
    while(b)
    {
        if (b&1)
            ans=ans*a;
        a*=a;
        b>>=1;
    }
    return ans;
}
void dg(int n,int x,int y)
{
    if (n==1)
    {
        rc[x][y]=1;
        return ;
    }
    int len=power(3,n-2);//枚举len的长度,也就是枚举两个X之间的空格数
    dg(n-1,x,y);//左上
    dg(n-1,x+2*len,y);//右上
    dg(n-1,x+len,y+len);//中间
    dg(n-1,x,y+2*len);//左下
    dg(n-1,x+2*len,y+2*len);//右下
    //以上具体可以通过样例理解
}
int main()
{
    while(1)
    {
        cin>>n;
        if (n==-1)//题目说的-1就要终止
            return 0;
        dg(n,1,1);
        for (i=1;i<=power(3,n-1);i++)
        {
            for (j=1;j<=power(3,n-1);j++)
                if (rc[i][j])
                    cout<<"X";
                else
                    cout<<" ";
            puts("");
        }
        puts("-");//题目中说的,要注意哦!
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[1010][1010],n,m,i,j;
int power(int a,int b)
{
    int ans=1;
    while(b)
    {
        if (b&1)
            ans*=a;
        a*=a;
        b>>=1;
    }
    return ans;
}
void dg(int n,int x,int y)
{
    if (n==1)
    {
        a[x][y]=1;
        return ;
    }
    int len=power(3,n-2);
    dg(n-1,x,y);
    dg(n-1,x+2*len,y);
    dg(n-1,x+len,y+len);
    dg(n-1,x,y+2*len);
    dg(n-1,x+2*len,y+2*len);
}
int main()
{
    while(cin>>n && n!=-1)
    {
        memset(a,0,sizeof(a));
        dg(n,1,1);
        for(int i=1;i<=power(3,n-1);i++)
        {
            for(int j=1;j<=power(3,n-1);j++)
                if (a[i][j])
                    cout<<'X';
                else
                    cout<<' ';
            cout<<endl;
        }
        cout<<"-"<<endl;
    }
    return 0;
}

```

17 评论


用户头像
exspecta   2024-12-22 19:47         踩      回复

dg(n-1,x+2*len,y);//这里应该是左下吧?


用户头像
Macintosh_K   2023-06-27 16:21         踩      回复

%%%学到了


用户头像
huangsitaozc   2022-09-13 16:34         踩      回复

大佬 orz

用户头像
huangsitaozc   2022-09-13 16:36         踩      回复

其实您的字也不算很丑

用户头像
huangsitaozc   2022-09-13 16:36    回复了 huangsitaozc 的评论         踩      回复

至少写的比我好

用户头像
350206A_u10551154ser30142325   2024-12-26 19:54    回复了 huangsitaozc 的评论         踩      回复

me too


用户头像
Karshey   2021-09-29 19:25         踩      回复

%%%%%%%%%%%%


用户头像
All_The_Way_North   2020-12-03 00:53         踩      回复

tql


用户头像
xhQYm   2020-01-10 11:02         踩      回复

%%


用户头像
戲言   2019-11-12 18:38         踩      回复

wr我的代码和您的差不多思路为啥我T了

用户头像
戲言   2019-11-12 18:40         踩      回复

我懂了。。我傻夫夫的去memset

用户头像
秦淮岸灯火阑珊   2019-11-12 19:50    回复了 戲言 的评论         踩      回复

QwQ


用户头像
戲言   2019-11-12 18:36         踩      回复

T..TLE了我。。为啥


用户头像
Frank2008_2   2019-10-07 10:00         踩      回复

666666666666666666666666666666666666666666666666666666666666666666666666

用户头像
秦淮岸灯火阑珊   2019-10-09 18:32         踩      回复

QwQ


用户头像
Abosite   2019-08-13 08:55         踩      回复

棒~!!

用户头像
秦淮岸灯火阑珊   2019-08-13 10:54         踩      回复

谢谢


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息