问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
输入
一个正整数 n (n< 30) 表示要求打印图形的层数。
输出
对应包围层数的该标志。
样例输入
3
样例输出
直接暴力循环
思路如下:
先打印出十字架 写第一个for循环:
然后打印四个角和四条边,发现可以写在一个for循环里,虽然比较复杂,但是时间复杂度应该算挺少的:
#include<iostream>
using namespace std;
char sizi[130][130];
int main(){
int n;
cin>>n;
for(int x=n*2;x<=2*n+4;x++){
sizi[x][2*n+2]=sizi[2*n+2][x]=1;
}
//画出十字架
for(int i=1;i<=n;i++){
sizi[2*i][2*i]=1;
sizi[2*i][2*(n-i)+4+2*n]=1;
sizi[2*(n-i)+4+2*n][2*i]=1;
sizi[2*(n-i)+4+2*n][2*(n-i)+4+2*n]=1;
sizi[2*i-1][2*i]=1;
sizi[2*i-1][2*(n-i)+4+2*n]=1;
sizi[2*(n-i)+4+2*n+1][2*i]=1;
sizi[2*(n-i)+4+2*n+1][2*(n-i)+4+2*n]=1;
sizi[2*i][2*i-1]=1;
sizi[2*i][2*(n-i)+4+2*n+1]=1;
sizi[2*(n-i)+4+2*n][2*i-1]=1;
sizi[2*(n-i)+4+2*n][2*(n-i)+4+2*n+1]=1;
//做出4个角
for(int s=2*i;s<=2*(n-i)+4+2*n;s++){
sizi[2*(i-1)][s]=1;
sizi[s][2*(i-1)]=1;
sizi[s][4*n+6-2*i]=1;
sizi[4*n+6-2*i][s]=1;
}
//做出4条边
}
for(int x=0;x<4*n+5;x++){
for(int y=0;y<4*n+5;y++){
if(sizi[x][y]!=1){cout<<'.';}
else{ cout<<'$';}
}
cout<<endl;
}
}