关于蓝桥杯------打印十字图
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
样例输入2
3
样例输出2
说实话,一开始看到这个题目,脑子里就很抗拒。 感觉很麻烦的样子。但是其实只要看到规律,挺好写的。
这个题目难点在于,你是否看到了这个图像分布的规律,分解为下面图片的样子。
下面的图在https://www.2cto.com/kf/201603/493268.html里面看到的,转载过来用一下。
很明显,规律就很浅显的看出来了。分为红色,蓝色,紫色,黄色,四个部分
而这些有规律的部分,蛮好又是左右或者上下对称的。所以基本都是两成循环的事情就能解决。
稍微改变横纵坐标就可以轻而易举的得到这个图像了。
我们可以一步一步写,比如先写红色部分。
最开始想到的应该是外围的长度。很碰巧这个总图像为正方形,且规律为差为4的等差递增数列。
所以可以得到ROW,与COL 为 a1 + (n-1)d.
ROW = COL = 9 + (N-1)*4;
N为输入的层数。
接下来的看其红色的规律,也是一个等差递减数列,差为4
而行是以差为2递增的,列是以ROW - (i+2)来表示
很容易就想到了下面的两层循环
for(i = 0; i <= min; i+=2) // 处理上下的
{
for(j = i + 2; j < ROW - (i+2); j++)
{
a[i][j] = 1;//这里是处理上面的
a[ROW - i - 1][j] = 1;//这里是处理下面的
}
}
同理,后面的蓝色,紫色,黄色,依次根据分析规律来得到两层循环。
for(j = 2; j <= min; j+=2) //左右的竖线(蓝色)
{
for(i = j - 2; i < j + 1; i++)
{
a[i][j] = 1;
a[i][COL - j - 1] = 1;
a[ROW - i - 1][j] = 1;
a[ROW - i - 1][COL - j - 1] = 1;
}
}
for(i = 2; i <= min; i += 2)//处理紫色
{
for(j = i - 2; j < i + 1; j++)
{
a[i][j] = 1;
a[i][COL - j - 1] = 1;
a[ROW - i - 1][j] = 1;
a[ROW - i - 1][COL - j - 1] = 1;
}
}
for(j = 0; j < min; j += 2)//左右长的竖线(黄色)
{
for(i = j+2; i < ROW - (j + 2); i++)
{
a[i][j] = 1;
a[i][ROW - j - 1] = 1;
}
}
从而就解决了十字图问题,可想而知,不要被题目吓到,仔细冷静分析就好。。。。。
下面是完整的代码
#include <stdio.h>
int a[150][150];
//将这个图划分为多个具有相同规律的部分 然后进行遍历就行
//图
int main()
{
int N;
int ROW,COL;
int min;
int i,j;
scanf("%d",&N);
ROW = COL = 9 + (N-1)*4;
min = ROW / 2;
for(i = 0; i <= min; i+=2) // 处理上下的
{
for(j = i + 2; j < ROW - (i+2); j++)
{
a[i][j] = 1;
a[ROW - i - 1][j] = 1;
}
}
for(j = 2; j <= min; j+=2) //左右的竖线
{
for(i = j - 2; i < j + 1; i++)
{
a[i][j] = 1;
a[i][COL - j - 1] = 1;
a[ROW - i - 1][j] = 1;
a[ROW - i - 1][COL - j - 1] = 1;
}
}
for(i = 2; i <= min; i += 2)
{
for(j = i - 2; j < i + 1; j++)
{
a[i][j] = 1;
a[i][COL - j - 1] = 1;
a[ROW - i - 1][j] = 1;
a[ROW - i - 1][COL - j - 1] = 1;
}
}
for(j = 0; j < min; j += 2)//左右长的竖线
{
for(i = j+2; i < ROW - (j + 2); i++)
{
a[i][j] = 1;
a[i][ROW - j - 1] = 1;
}
}
for(i = 0; i < ROW; i++)
{
for(j = 0; j < ROW; j++)
printf("%c", a[i][j] ? '$' : '.');
putchar('\n');
}
return 0;
}