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

本文介绍了一种在计算机dos窗口中使用字符绘制十字型徽标的算法,通过二维数组保存并输出图形,支持任意层数的控制。文章提供了一个C++实现示例,详细展示了如何创建一个关于水平和垂直方向中心对称的十字形图案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值