蓝桥杯 回型嵌套 递归 解题报告




观察这个图形,它是由一系列正方形的星号方框嵌套而成。
在上边的例子中,最外方框的边长为11。


本题的任务就是从标准输入获得一个整数n(1<n<100)
程序则生成嵌套着的回字型星号方框。其最外层方框的边长为n


例如:
输入:
5

程序输出:





输入:6
程序输出:



记得以前做过一个类似的打印图形的的题目,都是大图套小图,这种题目首先要找到规律,然后再确定要使用的方法,对于这种打印嵌套相似图形的题目,一般都是使用递归,因为循环的话不好控制循环层数,首先递归到最底层,然后打印最里面的图形,然后回溯打印外面的图形,规律也很容易看到,每次向里面走一层,边长就减4,然后再看每个图形左上角的起点,如果第一个起点为(0,0),第二个是(2,2),第三个是(4,4)。。。以此类推,有了起点,有了边长,就可以很轻松的打印出每一个图形,在打印图形的时候,可以单独处理第一行和最后一行,因为这两行是需要全部打印的,中间的部分只要打印两个点就可以了,这种处理方法可以应对所有的情况,包括只打印一个字符和打印四个字符这两种比较特别的情况,处理之前,要先把整个二维数组初始化成空格,这样就不用处理整个图形中的空格了。

#include<iostream>
using namespace std;
char map[101][101];
void paint(int len,int time)
{
	if(len<=0)
	return;
	paint(len-4,time+1);
	
	int x;
	int i,j;
	x=2*time;
	for(i=x;i<x+len;i++)
	map[x][i]='*';
	for(i=x+1;i<x+len-1;i++)
	map[i][x]=map[i][x+len-1]='*';
	for(i=x;i<x+len;i++)
	map[x+len-1][i]='*';
}

void init()
{
	int i,j;
	for(i=0;i<101;i++)
	for(j=0;j<101;j++)
	map[i][j]=' ';
}

int main()
{
	int n;
	int i,j;
	while(cin>>n)
	{
		init();
		paint(n,0);
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
		    cout<<map[i][j];
		    cout<<endl;
		}
	}
	return 0;
}



你可能感兴趣的:(递归,ACM,蓝桥杯,解题报告,回型嵌套)