打印图形|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;
}