时间限制:1.0s 内存限制:256.0MB
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
.
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
题解:从中心点开始向外延伸,然后补全拐角;
#include<iostream>
using namespace std;
char s[222][222];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=4*n+5;i++)
for(int j=1;j<=4*n+5;j++)
s[i][j]='.';
int x0,y0;//中心点
x0=y0=2*n+3;
s[x0][y0]='$';
for(int i=0;i<=n;i++){//向外一层一层打印
for(int j=x0-i*2;j<=x0+i*2;j++){//长度为i*2+1的一行或者一列
s[x0-(i+1)*2][j]='$';//上面一行
s[x0+(i+1)*2][j]='$';//下面一行
s[j][x0-(i+1)*2]='$';//左边一列
s[j][x0+(i+1)*2]='$';//右边一列
}
//下面补齐每一层的四个角
s[x0+i*2][y0+i*2]=s[x0+i*2+1][y0+i*2]=s[x0+i*2][y0+i*2+1]='$';//右下角三个
s[x0+i*2][y0-i*2]=s[x0+i*2+1][y0-i*2]=s[x0+i*2][y0-i*2-1]='$';//右上角三个
s[x0-i*2][y0+i*2]=s[x0-i*2-1][y0+i*2]=s[x0-i*2][y0+i*2+1]='$';//左下角三个
s[x0-i*2][y0-i*2]=s[x0-i*2-1][y0-i*2]=s[x0-i*2][y0-i*2-1]='$'; //左上角三个
}
for(int i=1;i<=4*n+5;i++){
for(int j=1;j<=4*n+5;j++)
printf("%c",s[i][j]);
printf("\n");
}
return 0;
}