打印图形(蓝桥杯省赛2018C/C++A组第五题) 补全填空题

题目:
如下的程序会在控制台绘制分形图(就是整体与局部自相似的图形)。

当 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     

思路:

  1. 寻找规律:3 * 3、9 * 9、27 * 27,malloc存储空间并初始化
  2. 通过递归将要打印的图形标记为1
  3. 将标记的图形进行输出显示
  4. 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

总结:

  1. malloc与free用法
  2. 通过递归对图形进行标记
  3. 在字符串中通过用一次函数a * x + b来表示二维空间
  4. 注意:s[w * y + x] = 1与draw(s,w,x-n,y,n);
上一篇:7-27 冒泡法排序 (20 分)


下一篇:循环缓冲区-c