惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
MyScale Blog
MyScale Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
博客园 - 司徒正美
D
Darknet – Hacking Tools, Hacker News & Cyber Security
量子位
N
News | PayPal Newsroom
S
Secure Thoughts
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LINUX DO - 热门话题
有赞技术团队
有赞技术团队
V
Visual Studio Blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Project Zero
Project Zero
B
Blog RSS Feed
J
Java Code Geeks
Google Online Security Blog
Google Online Security Blog
Last Week in AI
Last Week in AI
Cyberwarzone
Cyberwarzone
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
小众软件
小众软件
博客园 - 【当耐特】
Latest news
Latest news
T
Threat Research - Cisco Blogs
aimingoo的专栏
aimingoo的专栏
博客园_首页
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta
D
Docker
Forbes - Security
Forbes - Security
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V2EX - 技术
V2EX - 技术
N
Netflix TechBlog - Medium
The Last Watchdog
The Last Watchdog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Threatpost
Cloudbric
Cloudbric
T
The Exploit Database - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
Webroot Blog
Webroot Blog

OneCoder

【GESP】C++六级练习 luogu-B2174, 完全背包 【NOIP】2005真题解析 luogu-P1048 采药(适合GESP六级以上练习) 【GESP】C++六级真题 luogu-P17013, [GESP202606 六级] 满二叉树 【GESP】C++六级真题 luogu-P17012, [GESP202606 六级] 条形蛋糕 【GESP】C++五级真题 luogu-P17011 [GESP202606 五级] 晚宴 【GESP】C++五级真题 luogu-P17010 [GESP202606 五级] 排排坐 【GESP】C++四级真题 luogu-B4558 [GESP202606 四级] 身高体重指数 【GESP】C++四级真题 luogu-B4557 [GESP202606 四级] 扫雷 【GESP】C++三级真题 luogu-B4556 [GESP202606 三级] 字符转换 【GESP】C++三级真题 luogu-B4555 [GESP202606 三级] 加密 【GESP】C++二级真题 luogu-B4553 [GESP202606 二级] 完全平方数计数 【GESP】C++一级真题 luogu-B4551 [GESP202606 一级] 去旅行 【GESP】C++一级真题 luogu-B4552 [GESP202606 一级] 交税 【NOIP】2000真题解析 luogu-P1023 税收与补贴问题(适合GESP四、五级以上练习) 【NOIP】2000真题解析 luogu-P1022 计算器的改良(适合GESP四、五级以上练习) 【NOIP】2001真题解析 luogu-P1029 最大公约数和最小公倍数问题 【CSP】CSP-X 2018真题 11的倍数 luogu-B4075 (适合GESP三级及以上考生练习) 【CSP】CSP-X 2018真题 统计成绩 luogu-B4074 (适合GESP二级及以上考生练习) 【CSP】CSP-X 2018真题 快递费用 luogu-B4073 (适合GESP二级及以上考生练习) 【CSP】CSP-X 2018真题 小明的照片 luogu-B4072 (适合GESP一级及以上考生练习) 【GESP】C++四级练习 luogu-P1138 第 k 小整数 【NOIP】2008真题解析 luogu-P1125 笨小猴 【信奥业余科普】C++ 的奇妙之旅 29:别让 TLE 和 MLE 偷走你的分——复杂度估算与数据范围速查 【信奥业余科普】C++ 的奇妙之旅 28:规范比赛代码的钥匙——文件操作与输入输出重定向(freopen) 【CSP】CSP-J 2023真题 公路 luogu-P9749 (适合GESP四级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 27:高效处理数据的利器——常用算法库(algorithm) 【CSP】CSP-J 2022真题 解密 luogu-P8814 (适合GESP四级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 26:高效的键值对——映射(map)与多重映射(multimap) 【CSP】CSP-J 2022真题 乘方 luogu-P8813 (适合GESP二级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 25:自动排序的利器——集合(set)与多重集合(multiset) 【CSP】CSP-J 2019真题 纪念品 luogu-P5662 (适合GESP六级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 24:拆解 deque——分段连续的双端队列 【信奥业余科普】C++ 的奇妙之旅 23:主动限制的艺术——栈(stack)与队列(queue)
【GESP】C++二级真题 luogu-B4554 [GESP202606 二级] 菱形
OneCoder · 2026-06-30 · via OneCoder

GESP C++二级,2026年6月真题,嵌套循环与字符图形绘制,难度⭐⭐,洛谷难度普及-

luogu-B4554 [GESP202606 二级] 菱形

题目要求

题目描述

给定正整数 $n$,在 $(2n - 1) \times (2n - 1)$ 个网格的画布中,使用字符画一个边长为 $n$ 个网格的菱形。其中,空白网格使用 $.$ 表示,菱形边所在的网格用 $+$ 表示。

例如当 $n = 3$ 时,图形如下:

1
2
3
4
5
..+..
.+.+.
+...+
.+.+.
..+..

输入格式

输入一个正整数 $n$。

输出格式

输出 $2n - 1$ 行,表示按要求画的菱形。

输入输出样例 #1

输入 #1

输出 #1

1
2
3
4
5
6
7
...+...
..+.+..
.+...+.
+.....+
.+...+.
..+.+..
...+...

说明/提示

数据范围

$3 \le n \le 15$。


题目分析

解题思路

本题的解题思路如下:

  1. 问题本质:
    • 在 $(2n-1) \times (2n-1)$ 的网格中绘制一个菱形
    • 菱形的中心在第 $n$ 行第 $n$ 列(从 $1$ 开始计数),边长为 $n$
    • 菱形边上的格子用 + 表示,其余用 . 表示
  2. 解题关键 — 判断菱形边上的点:
    • 菱形上的点满足条件:与中心点的曼哈顿距离恰好等于 $n - 1$
    • 即对于第 $i$ 行第 $j$ 列(均从 $0$ 开始计数),若 $|i - (n-1)| + |j - (n-1)| = n - 1$,则该位置是菱形边上的点
    • 也可以分上下两半来理解:
      • 上半部分(第 $0$ 到 $n-1$ 行):第 $i$ 行的 + 出现在第 $n-1-i$ 列和第 $n-1+i$ 列
      • 下半部分(第 $n$ 到 $2n-2$ 行):与上半部分关于中间行对称
    • 特殊情况:第 $0$ 行和第 $2n-2$ 行只有一个 +(菱形的上下顶点)
  3. 复杂度分析:
    • 时间复杂度:$O(n^2)$,需要遍历 $(2n-1) \times (2n-1)$ 的网格
    • 空间复杂度:$O(1)$,只需常数个变量

示例代码

方法一、利用曼哈顿距离判断

通过判断每个位置与菱形中心的曼哈顿距离是否等于 $n - 1$,来确定该位置是否为菱形边上的点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cmath>

int main() {
    // 读入菱形的边长
    int n;
    std::cin >> n;
    // 网格大小为 (2n-1) x (2n-1)
    int size = 2 * n - 1;
    // 菱形中心位置(行列下标均为 n-1)
    int center = n - 1;
    // 遍历每一行
    for (int i = 0; i < size; i++) {
        // 遍历每一列
        for (int j = 0; j < size; j++) {
            // 计算当前位置到中心的曼哈顿距离
            // 若距离恰好等于 n-1,则该位置是菱形边上的点
            if (std::abs(i - center) + std::abs(j - center) == n - 1) {
                std::cout << "+";
            } else {
                std::cout << ".";
            }
        }
        // 每行结束后换行
        std::cout << std::endl;
    }
    return 0;
}

方法二、分别计算每行的 + 位置

根据每一行到中心行的距离,直接计算 + 出现的列号,逐字符输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>

int main() {
    // 读入菱形的边长
    int n;
    std::cin >> n;
    // 网格大小为 (2n-1) x (2n-1)
    int size = 2 * n - 1;
    // 遍历每一行
    for (int i = 0; i < size; i++) {
        // 计算当前行到中心行的距离
        int dist;
        if (i < n) {
            dist = n - 1 - i;
        } else {
            dist = i - (n - 1);
        }
        // 第 i 行的 '+' 出现在第 dist 列和第 size - 1 - dist 列
        for (int j = 0; j < size; j++) {
            if (j == dist || j == size - 1 - dist) {
                std::cout << "+";
            } else {
                std::cout << ".";
            }
        }
        // 每行结束后换行
        std::cout << std::endl;
    }
    return 0;
}


所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

"luogu-"系列题目可在洛谷题库进行在线评测。

"bcqm-"系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号

GESP/CSP 认证学习微信公众号