题目描述
分形,具有以非整数维形式充填空间的形态特征。
通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
现在,定义“盒子分形”如下:
一级盒子分形:
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
-
模拟+递归
解题思路:
- 这道题目思维难度不是很大,我们主要是要看清题目的输出格式,其实当$n>1$的时候,每一个输出,都可以看作成为九宫格。
- 接着我们可以注意一下每两个$X$之间的空格,就可以发现一定的规律。
- 这道题目可以不用递归做,但是用递归做非常的简便。
然而我还是用了一个半小时
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;
}
```
dg(n-1,x+2*len,y);//这里应该是左下吧?
%%%学到了
大佬 orz
其实您的字也不算很丑
至少写的比我好
me too
%%%%%%%%%%%%
tql
%%
wr我的代码和您的差不多思路为啥我T了
我懂了。。我傻夫夫的去memset
QwQ
T..TLE了我。。为啥
666666666666666666666666666666666666666666666666666666666666666666666666
QwQ
棒~!!
谢谢