zoukankan      html  css  js  c++  java
  • 打印图形|2014年蓝桥杯B组题解析第五题-fishers

    打印图形

    小明在X星球的城堡中发现了如下图形和文字:
    rank=3

    rank=5

    rank = 6

    小明开动脑筋,编写了如下的程序,实现该图形的打印。

    答案:f(a, rank-1, row, col+w/2);

    思路:遇到递归就要想到规模减小和出口在哪!

    1.递归就要想到规模减小,所以第二个参数rank-1是肯定不变的
    2.另外第一个参数a数组必定不变
    只需要更改row 和 col这两个参数了。
    下面是对这两个参数的分析:

    3.先把数据改小,直接运行一遍程序
    发现只打印了最后一行,

    为什么只打印最后一行呢?因为填空部分的后两行第三个参数:row+w/2,较row下移了w/2个单位长度

    所以我们想打印前面几行的*,必须将row+w/2这第三个参数缩小。缩小多少呢?可以先预估第三个行参数可能为row。

    4.接着我们再分析第四个参数 col 列参数:
    当我们注释掉最后一个f递归语句(如下图)

    运行结果是这样的:

    我们发现,只在第一列上打印了*,而之前有这一行时打印了4列。
    说明第四个参数也就是col这个,是控制”列“的,我们必须增加col这个参数的值
    那么,col这一列要增加多少呢?之前row都是增加w/2,这里也直接预估参数增加了w/2,即col+w/2
    填入f(a, rank-1, row, col+w/2);运行程序结果正确!

    #include<stdio.h> 
    #include<iostream>
    using namespace std;
    #define N 10 
    
    void f(char a[][N], int rank, int row, int col)
    {
        if(rank==1){
        	cout<<"row = "<<row<<" col= "<<col<<endl; 
            a[row][col] = '*';
            return;
        }
        
        int w = 1;
        int i;
    
        for(i=0; i<rank-1; i++) {
    		w *= 2;
    	} 
        
        f(a, rank-1, row, col+w/2); //填空 当前行 
        f(a, rank-1, row+w/2, col);  
        f(a, rank-1, row+w/2, col+w);
    }
    
    int main()
    {
        char a[N][N];
        int i,j;
        for(i=0;i<N;i++)
        for(j=0;j<N;j++) a[i][j] = ' ';
        
        f(a,3,0,0);
        
        for(i=0; i<N; i++){
            for(j=0; j<N; j++) printf("%c",a[i][j]);
            printf("
    ");
        }
        
        return 0;
    }
  • 相关阅读:
    史上最复杂业务场景_逼出阿里高可用三大法宝
    六一儿童节PHP宝宝又被围剿了,迅速围观!
    程序员常用远程工具有哪些?
    Kotlin真的会取代JAVA吗?
    云通信—连接产品与用户的桥梁
    小团队能做大系统:Cloud_Native云原生架构实践
    打造立体化监控体系的最佳实践——分布式调用跟踪和监控时间
    “机器学习”三重门_“中庸之道”趋若人(深度学习入门系列之四)
    ehcache缓存
    hibernate延迟加载
  • 原文地址:https://www.cnblogs.com/fisherss/p/10286304.html
Copyright © 2011-2022 走看看