蓝桥杯历届-打印十字图
题目标题:打印十字图
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
$$$$$$$$$$$$$
$ $
$$$ $$$$$$$$$ $$$
$ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $ $
$ $ $ $$$$$ $ $ $
$ $ $ $ $ $ $
$ $ $$$ $ $$$ $ $
$ $ $ $ $ $
$ $$$ $$$$$ $$$ $
$ $ $ $
$$$ $$$$$$$$$ $$$
$ $
$$$$$$$$$$$$$
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
输入格式:
一个正整数 n (n<30) 表示要求打印图形的层数
输出:
对应包围层数的该标志。
例如:
请仔细观察样例,尤其要注意句点的数量和输出位置。
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
#include<cstdio>
#include<iostream>
using namespace std;
int go(int i, int j, int n) {
//上下对称
if (i - 1 > (n*4+5)/2) {
i = i - (i - ((n*4+5)/2 + 1))*2;
}
// 左右对称
if (j - 1 > (n*4+5)/2) {
j = j - (j - ((n*4+5)/2 + 1))*2;
}
if (i%2 == 0 && j >= i+1) {
if (i > 1 && j == i+1 && i%2 == 0) return 1;
else return 0;
}
if (i > 1 && j == i+1 && i%2 == 1) return 0;
// 前面两行.
if (i <= 2 && j <= 2) return 0;
// 连续三个$
if (i%2 == 1 && j >= i-2) return 1;
// $
if (j%2 == 1 && j != i-1) return 1;
return 0;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n*4+5; i++) {
for (int j = 1; j <= n*4+5; j++) {
if (go(i,j,n)){
printf("$");
} else {
printf(".");
}
}
puts("");
}
return 0;
}