题目:
如下的程序会在控制台绘制分形图(就是整体与局部自相似的图形)。
当 n=1,2,3 的时候,输出如下: 请仔细分析程序,并填写划线部分缺少的代码。
n=1 时:
o
ooo
o
n=2 时:
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
n=3时:
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
o o o
ooo ooo ooo
o o o
o o o o o o o o o
ooooooooooooooooooooooooooo
o o o o o o o o o
o o o
ooo ooo ooo
o o o
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
思路:
- 寻找规律:3 * 3、9 * 9、27 * 27,malloc存储空间并初始化
- 通过递归将要打印的图形标记为1
- 将标记的图形进行输出显示
- free释放内存空间
代码:
#include <stdio.h>
#include <stdlib.h>
void show(char* s , int w){
int i,j;
for(i = 0; i < w; i++){
for(j = 0; j < w; j++){
if(s[i*w+j] == 1){
printf("%c",'o');
}else{
printf("%c", ' ');
}
}
printf("\n");
}
}
void draw(char* s ,int w, int x, int y, int size){
if(size == 1){
s[w * y + x] = 1;
return;
}
int n = size / 3;
draw(s,w,x,y,n);
draw(s,w,x-n,y,n);
draw(s,w,x+n,y,n);
draw(s,w,x,y-n,n);
draw(s,w,x,y+n,n);
}
int main()
{
int N;
scanf("%d",&N);
int t = 1;
int i;
for(i = 0; i < N; i++){
t *= 3;
}
char* buf = (char *)malloc(t * t);
for(i = 0;i < t * t;i++){
buf[i] = 0;
}
draw(buf,t,t/2,t/2,t);
show(buf,t);
free(buf);
return 0;
}
结果显示:
image.png
总结:
- malloc与free用法
- 通过递归对图形进行标记
- 在字符串中通过用一次函数a * x + b来表示二维空间
- 注意:s[w * y + x] = 1与draw(s,w,x-n,y,n);