打印十字图解析

                                关于蓝桥杯------打印十字图

 

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

对方同时也需要在电脑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;
}
  1.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值