[蓝桥杯][历届试题]打印十字图

打印十字图-蓝桥杯历届试题

打印十字图-蓝桥杯历届试题
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

[蓝桥杯][历届试题]打印十字图

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。

输出格式
对应包围层数的该标志。

样例输入1
1

样例输出1

[蓝桥杯][历届试题]打印十字图

样例输入2
3

样例输出2
[蓝桥杯][历届试题]打印十字图

提示
请仔细观察样例,尤其要注意句点的数量和输出位置。


分析:这个图形是中心对称的。所以,我们可以考虑从中间的点出发,找规律向外扩张。可以实现定义一个map二维数组记录图形。最后输出


#include<iostream>
using  namespace std;
char map[130][130];
int main() {
    int n, edge, mid;
    cin >> n;
    edge = 9 + 4 * (n - 1);
    for (int i = 1; i <= edge; i++) {
        for (int j = 1; j <= edge; j++) {
            map[i][j] = '.';
        }
    }
    int num = 1; //层数
    mid = (edge + 1) / 2;
    while(num <= n) {
        if(num == 1) { //中间部分
            for (int i = -2; i <= 2; i++) {
                map[mid][mid + i] = '$';
            }
            for (int i = -2; i <= 2; i++) {
                map[mid + i][mid] = '$';
            }
        }
        int a = mid - (2 * (num - 1) + 4);
        int b = mid + (2 * (num - 1) + 4);
        for (int i = - 2 * num; i <= 2 * num; i++) { //边
            map[a][mid + i] = '$';
            map[b][mid + i] = '$';
            map[mid + i][a] = '$';
            map[mid + i][b] = '$';
        }
        for (int i = 1; i <= 2; i++) { //角
            map[a + 2][a + i] = '$';
            map[a + i][a + 2] = '$';
            map[b - 2][a + i] = '$';
            map[b - i][a + 2] = '$';
            map[b - 2][b - i] = '$';
            map[b - i][b - 2] = '$';
            map[a + i][b - 2] = '$';
            map[a + 2][b - i] = '$';
        }
        num++;
    }
    for (int i = 1; i <= edge; i++) {
        for (int j = 1; j <= edge; j++) {
            cout << map[i][j];
        }
        cout << endl;
    }
    return 0;
}