蓝桥杯历届-打印十字图

蓝桥杯历届-打印十字图

题目标题:打印十字图

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见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;
}

你可能感兴趣的:(蓝桥杯历届-打印十字图)