n度的盒分形的规模为3(n-1),即n度的盒分形图为一个长宽为3(n-1)的正方形。
设置递归函数printBox(n,x,y)生成以坐标(x,y)为左上角的n度盒分形。
1)递归边界: 若n=1,则在(x,y)输出‘X’
2)若n>1,则计算n-1度的盒子的规模 m = 3^(n-2),分别在左上方, 右上方,中间,左下方和右下方画出5个n-1度的盒子。
对于左上方的n-1度的盒子,左上角的坐标为(x,y),递归printBox(n-1,x,y)生成;
对于右上方的n-1度的盒子,左上角的坐标为(x+2m,y),递归printBox(n-1,x+2m,y)生成;
对于中间的n-1度的盒子,左上角的坐标为(x+m,y+m),递归printBox(n-1,x+m,y+m)生成;
对于左下方的n-1度的盒子,左上角的坐标为(x,y+2m),递归printBox(n-1,x,y+2m)生成;
对于右上方n-1度的盒子,左上角的坐标为(x+2m,y+2m),递归printBox(n-1,x+2m,y+2m)生成
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
char a[735][735];
void dfs(int cur,int x,int y)
{
if(cur==1)
{
a[x][y]='X';
return ;
}
int s=pow(3,cur-2);
dfs(cur-1,x,y);
dfs(cur-1,x,y+2*s);
dfs(cur-1,x+s,y+s);
dfs(cur-1,x+2*s,y);
dfs(cur-1,x+2*s,y+2*s);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==-1)
break;
memset(a,' ',sizeof(a));
dfs(n,1,1);
int s=pow(3,n-1);
for(int i=1;i<=s;i++)
{
a[i][s+1]='\0';
}
for(int i=1;i<=s;i++)
{
printf("%s\n",a[i]+1);
}
printf("-\n");
}
return 0;
}