11E:分形盒
- 总时间限制:
- 1000ms
- 内存限制:
- 30000kB
- 描述
-
分形,通常被定义为一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。它跟分数维、自组织、非线性系统和混沌等具有非常重要的联系。
分形盒就是这样一种分形,它的定义如下:
维度是1的分形盒:
X
维度是2的分形盒:
X X
X
X X
如果已知维度是(n-1)的分形盒,那么维度是n的分形盒的递归定义如下所示:
Box(n-1) Box(n-1)
Box(n-1)
Box(n-1) Box(n-1)
你的任务是画一个维度为n的分形盒。
- 输入
- 输入包含多组测试数据。每一行包含一个正整数n表示分形盒的维度,n不大于7;最后一行是一个-1,表示输入结束。
- 输出
- 对于每组测试数据,输出要求维度的分形盒,注意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 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 char a[2200][2200]; 6 void draw(int x, int y, int n){ //左上角为x,y,画一个层数为n的分型盒 7 if(n==0){ 8 a[x][y] = 'X'; 9 return; 10 } 11 draw(x,y,n-1); //左上 12 draw(x,y+2*pow(3,n-1),n-1);//右上 13 draw(x+2*pow(3,n-1), y, n-1); //左下 14 draw(x+2*pow(3,n-1), y+2*pow(3,n-1), n-1); //右下 15 draw(x+pow(3,n-1), y+pow(3,n-1), n-1); 16 } 17 int main(){ 18 int n; 19 while(1){ 20 memset(a,0,sizeof(0)); 21 cin>>n; 22 if(n==-1) break; 23 draw(1,1,n-1); 24 for(int i = 1; i <= pow(3,n-1); i++){ 25 for(int j = 1; j <= pow(3,n-1); j++){ 26 if(a[i][j]==0) cout<<" "; 27 else cout<<"X"; 28 } 29 cout<<endl; 30 } 31 cout<<"-"<<endl; 32 } 33 return 0; 34 }
备注:我好了。本来我特别不会做这种画分型图的题。但其实只要找好层数和边长的关系,然后找到几个组成部分的左上顶点坐标,递归来画就可以。
这道题,对于层数为n的分型箱,边长为pow(3,n-1)。所以我的draw的参数n实际上是n-1,0为边界条件。
画分形图好解压QAQ