• 倪文迪陪你学蓝桥杯2021寒假每日一题:1.17日(2018省赛A组第5题)


    2021年寒假每日一题,2017~2019年的省赛真题。
    本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供。
    后面的每日一题,每题发一个新博文,请大家每天蓝桥杯专栏: https://blog.csdn.net/weixin_43914593/category_10721247.html

    @

    2018省赛A组第5题"打印图形",一道代码填空题,题目无链接。

    1、题目描述


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

    当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
    

    源程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    void show(char* buf, int w){
    	int i,j;
    	for(i=0; i<w; i++){
    		for(j=0; j<w; j++){
    			printf("%c", buf[i*w+j]==0? ' ' : 'o');
    		}
    		printf("
    ");
    	}
    }
    
    void draw(char* buf, int w, int x, int y, int size){
    	if(size==1){
    		buf[y*w+x] = 1;
    		return;
    	}
    	
    	int n = _________________________ ; //填空
    	draw(buf, w, x, y, n);
    	draw(buf, w, x-n, y ,n);
    	draw(buf, w, x+n, y ,n);
    	draw(buf, w, x, y-n ,n);
    	draw(buf, w, x, y+n ,n);
    }
    
    int main()
    {
    	int N = 3;
    	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;
    }
    

    注意:只提交划线部分缺少的代码,不要抄写任何已经存在的代码或符号。


    2、说明

      从N=1,2,3的图形可以看出,每次N加1时,新的图形是把上一个图形复制5次,分别放在上、下、左、右、中这5个位置。
      在看代码之前,我们可以自己思考如何实现。其实方法是很直接的:
    (1)图形用矩阵来表示,存储每个小圆圈的坐标。
    (2)可以确定,应该用递归来处理不同的N值。画大小为N的图时,就递归5次大小为N-1的图,放在5个位置。
      有了上面的思路再看代码。
    (1)代码中用buf[]存图,它虽然是一维数组,但实际表示的是矩阵。
    (2)递归函数draw()中递归画5个小图。填空处的n值,是递归前设置的N-1的小图的宽度,它是以3倍减小的,答案是:

    	int n = size/3 ; //填空
    
  • 相关阅读:
    Python:FriendFeed的Tornado Web Server
    用psake来简化自动化脚本的构建
    Eucalyptus企业云计算
    兰州大学百年校庆风雨百年萃英路
    JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法
    Winform开发框架之权限管理系统
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)常用操作
    Socket开发框架之数据采集客户端
    Winform开发框架之终极应用
    Winform分页控件使用详细介绍
  • 原文地址:https://www.cnblogs.com/luoyj/p/14298418.html
Copyright © 2020-2023  润新知