问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示: 对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入
一个正整数 n (n<30) 表示要求打印图形的层数。
输出
对应包围层数的该标志。
样例
输入:1,3 输出:
【想说的】:打印的题目其实都没有很怕,就是一葫芦画瓢,找到规律打印,但是这个题目有一个巧妙的地方,其实以前用过这个技巧,有点忘记了,就是整体的去看这个图形,修改数组的值,最后整个数组输出。 【启示】一层一层去剖析,发现十字架除掉转角的部分其实很好构造,就是横着竖着的部分,规律也很明显,然后再去逐个实现转角。(挺巧妙的!)
题解
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
using namespace std
;
char pic
[130][130];
int main()
{
int n
;
while(~scanf("%d",&n
))
{
memset(pic
,'.',sizeof(pic
));
int m
=4*n
+5;
int tem
=m
/2;
for(int i
=1;i
<=2;i
++)
{
pic
[tem
][tem
+i
]='$';
pic
[tem
][tem
-i
]='$';
pic
[tem
+i
][tem
]='$';
pic
[tem
-i
][tem
]='$';
}
pic
[tem
][tem
]='$';
int k
=1;
int nn
=n
;
int ls
=0;
int lx
=m
-1;
while(k
<=n
)
{
for(int i
=0;i
<4*nn
+1;i
++)
{
pic
[ls
][2*k
+i
]='$';
pic
[lx
][2*k
+i
]='$';
pic
[2*k
+i
][ls
]='$';
pic
[2*k
+i
][lx
]='$';
}
pic
[ls
+1][2*k
]='$';pic
[ls
+2][2*k
]='$';pic
[ls
+2][2*k
-1]='$';
pic
[lx
-1][2*k
]='$';pic
[lx
-2][2*k
]='$';pic
[lx
-2][2*k
-1]='$';
pic
[lx
-1][m
-2*k
-1]='$';pic
[lx
-2][m
-2*k
-1]='$';pic
[lx
-2][m
-2*k
]='$';
pic
[2*k
][lx
-1]='$';pic
[2*k
][lx
-2]='$';pic
[2*k
-1][lx
-2]='$';
ls
+=2;
lx
-=2;
k
++;
nn
--;
}
for(int i
=0;i
<m
;i
++)
{
for(int j
=0;j
<m
;j
++)
{
printf("%c",pic
[i
][j
]);
}
printf("\n");
}
}
}