打印图形|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("\n");
    }
    
    return 0;
}
posted @ 2019-01-18 10:25  fishers  阅读(372)  评论(0编辑  收藏  举报