分形问题
【问题描述】 分形是指具有自相似性的对象,理论上这种自相似性的规模可以任意大,对象不需要在任意尺度上结构完全相同,但要求在任意规模上,结构的类型要相同。
箱式分形的定义如下:
1 维箱式分形如下图所示:
X
2 维箱式分形为:
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 维箱式分形。
【输入形式】
每一行一个不超过 5 的正整数,最后一行 -1 代表结束标志。
【输出形式】
对于每一个测试用例,输出箱式分形图形使用 ’X’ 作为基本组成单元,不同输出用“ - ”隔开。
【输入样例】
1
2
3
-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
用递归可以解,但问题是到了第三个就出问题了,怎么能让两个B(n-1)在同一横排显示。 分形问题
[解决办法]
//输入1
//输出
//* *
// *
//* *
//输入2
//输出
//* * * *
// * *
//* * * *
// * *
// *
// * *
//* * * *
// * *
//* * * *
//输入3
//输出
//* * * * * * * *
// * * * *
//* * * * * * * *
// * * * *
// * *
// * * * *
//* * * * * * * *
// * * * *
//* * * * * * * *
// * * * *
// * *
// * * * *
// * *
// *
// * *
// * * * *
// * *
// * * * *
//* * * * * * * *
// * * * *
//* * * * * * * *
// * * * *
// * *
// * * * *
//* * * * * * * *
// * * * *
//* * * * * * * *
//最大输入8
#include <stdio.h>
char m[6561][6561];//==3^8
void fractalx(int cy,int cx,int L) {
int N,i;
if (1==L) {
m[cy ][cx ]='*';
m[cy-1][cx-1]='*';
m[cy-1][cx+1]='*';
m[cy+1][cx+1]='*';
m[cy+1][cx-1]='*';
} else {
N=1;for (i=0;i<L-1;i++) N=N*3;
fractalx(cy ,cx ,L-1);
fractalx(cy-N,cx-N,L-1);
fractalx(cy-N,cx+N,L-1);
fractalx(cy+N,cx+N,L-1);
fractalx(cy+N,cx-N,L-1);
}
}
int main() {
int L,N,i,y,x;
while (1) {
while (1) {
printf("\nInput 1..8,0 for Exit:");
fflush(stdout);
if (1==scanf("%d",&L)) {
if (0<=L && L<=8) break;
} else rewind(stdin);
}
if (0==L) break;
N=1;for (i=0;i<L;i++) N=N*3;
for (y=3280-(N-1)/2;y<=3280+(N-1)/2;y++) {
for (x=3280-(N-1)/2;x<=3280+(N-1)/2;x++) {
m[y][x]=' ';
}
}
fractalx(3280,3280,L);
for (y=3280-(N-1)/2;y<=3280+(N-1)/2;y++) {
for (x=3280-(N-1)/2;x<=3280+(N-1)/2;x++) {
printf("%c",m[y][x]);
}
printf("\n");
}
}
return 0;
}