A39798. 分形盒
题目描述
分形盒
题目描述
分形,通常被定义为一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。它跟分数维、自组织、非线性系统和混沌等具有非常重要的联系。
分形盒就是这样一种分形,它的定义如下:
维度是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
1
2
3
4
5
样例输出
X
-
X X
X
X X
-
X X X X
X X
X X X X
X X
X
X X
X X X X
X X
X X X X
-
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
X X X X
X X
X
X X
X X X X
X X
X X X X
X X X X X X X X
X X X X
X X X X X X X X
X X X X
X X
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>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=3010;
int n;
int ch[maxn][maxn];
void init()//标记所有显示符号位
{
ch[1][1]=1;
for(int k=2;k<=8;k++){//维度
int p=pow(3,k-2);//偏移量
for(int i=1;i<=p;i++){//行
for(int j=1;j<=p;j++){//列
ch[i+2*p][j]=ch[i][j+2*p]=ch[i+p][j+p]=ch[i+2*p][j+2*p]=ch[i][j];//把n-1级图形作为n级图形的左上角,这个图形的每个坐标分别加上四个偏移量得到其余四个分量
}
}
}
}
void output()
{
int N=pow(3,n-1);
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(ch[i][j]) cout<<"X";
else cout<<" ";
}
cout<<endl;
}
cout<<"-"<<endl;
}
int main()
{
init();
while(cin>>n&&n!=-1){
output();
}
return 0;
}