您的位置:首页 > 其它

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

2015-02-28 22:41 148 查看


观察这个图形,它是由一系列正方形的星号方框嵌套而成。

在上边的例子中,最外方框的边长为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息