蓝桥杯历届试题 打印十字图 题解(100分)C++

历届试题 打印十字图 
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。

 


提示
请仔细观察样例,尤其要注意句点的数量和输出位置。

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T25

参考图片:(很直观!)

https://images2015.cnblogs.com/blog/927750/201705/927750-20170509222645082-423672066.png

想法都在下面的代码里啦:(可以看到中间的红色十字,从它开始出发,然后先给它四周围上一圈白色,再围上一圈红色,这样一层红色十字图就好了,再反复几次就能加几层的十字。)

#include<stdio.h>
int main()
{
	int n;//层数
	scanf("%d",&n);
	int maze[130][130]={0};
	int row=9+(n-1)*4,mid=row/2;
	//给中间的十字“染色” 
	maze[mid][mid]=maze[mid][mid-1]=maze[mid][mid-2]=maze[mid][mid+1]=maze[mid][mid+2]=1;
	maze[mid-1][mid]=maze[mid-2][mid]=maze[mid+1][mid]=maze[mid+2][mid]=1;
	int i=mid-3,k=n,len=7;
	while(k--)//要加n层红色($,值以1表示)   就是染两次色 
	{
		int p=0,q=0;
		//以红色为边界,染一层白色(值为2) 
		for(p=i;p<i+len;p++)
		{
			for(q=i;q<i+len;q++)
			{
				if(maze[p][q]==1)
				{
					int dir[8][2]={{0,1},{1,0},{0,-1},{-1,0},{1,-1},{1,1},{-1,-1},{-1,1}},j;
					for(j=0;j<8;j++)//将红色的周围八个不是红色的小方块染成白色(2表示) 
					{
						int x=p+dir[j][0];
						int y=q+dir[j][1];
						if(maze[x][y]==0)
							maze[x][y]=2;
					}
				}
			}
		}
		i-=1;
		len+=2;
		//以白色为边界,染一层红色(值为1) 
		for(p=i;p<i+len;p++)
		{
			for(q=i;q<i+len;q++)
			{
				if(maze[p][q]==2)
				{
					int dir[8][2]={{0,1},{1,0},{0,-1},{-1,0},{1,-1},{1,1},{-1,-1},{-1,1}},j;
					for(j=0;j<8;j++)//将白色的周围八个未被染色的小方块染成红色
					{
						int x=p+dir[j][0];
						int y=q+dir[j][1];
						if(maze[x][y]==0)
							maze[x][y]=1;
					}
				}
			}
		}
		i-=1;
		len+=2;
	}
	for(i=0;i<row;i++)
	{
		for(k=0;k<row;k++)
		{
			if(maze[i][k]==1)
				printf("$");
			else//白色(2)或者没填的 (0)
				printf(".");
		}
		printf("\n");
	}
	return 0;
}

看着挺长的样子,但是我感觉挺容易理解的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值