历届试题 打印十字图
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑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;
}
看着挺长的样子,但是我感觉挺容易理解的。