问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
样例输入2
3
样例输出2
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
#include <cstdio>
#include <iostream>
using namespace std;
/*
使用二维数组,先保存答案然后统一输出会方便很多。
仔细观察,这是一个关于水平和垂直方向中心对称的图形。
我的做法是:先全部变成'$',然后再外面一层一层地变成'.'
*/ // 1 3 4
char s[130][130]; // 9 17 21 可以凑出n*4+5
int main() {
int n, m;
scanf("%d", &n);
m = n*4+5 - 1; // 从0记数,所以减1
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= m; j++) {
s[i][j] = '$';
}
}
int ly = 3, ry = m - 3; // 左边的y,右边的y
int ux = 1, dx = m - 1; // 上面的x,下面的x
s[0][0] = s[0][1] = s[0][m-1] = s[0][m] = '.'; // 四个角
s[1][0] = s[1][1] = s[1][m-1] = s[1][m] = '.';
s[m-1][0] = s[m-1][1] = s[m-1][m-1] = s[m-1][m] = '.';
s[m][0] = s[m][1] = s[m][m-1] = s[m][m] = '.';
for (int t = 1; t <= n; t++) { // n个外层
for (int i = ly; i <= ry; i++) { // 最上下
s[ux][i] = s[dx][i] = '.';
}
for (int i = ux; i <= ux+2; i++) { // 左右
s[i][ly] = s[i][ry] = '.';
}
for (int i = dx; i >= dx-2; i--) { // 左右
s[i][ly] = s[i][ry] = '.';
}
for (int i = ly-2; i <= ly; i++) {
s[ux+2][i] = s[dx-2][i] = '.';
}
for (int i = ry; i <= ry+2; i++) {
s[ux+2][i] = s[dx-2][i] = '.';
}
for (int i = ux+2; i <= dx-2; i++) { // 最左右
s[i][ly-2] = s[i][ry+2] = '.';
}
ly += 2; ry -= 2;
ux += 2; dx -= 2;
}
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= m; j++) {
printf("%c", s[i][j]);
}
printf("\n");
}
return 0;
}