


























GESP C++二级,2026年6月真题,嵌套循环与字符图形绘制,难度⭐⭐,洛谷难度普及-。
给定正整数 $n$,在 $(2n - 1) \times (2n - 1)$ 个网格的画布中,使用字符画一个边长为 $n$ 个网格的菱形。其中,空白网格使用 $.$ 表示,菱形边所在的网格用 $+$ 表示。
例如当 $n = 3$ 时,图形如下:
1 2 3 4 5 ..+.. .+.+. +...+ .+.+. ..+..
输入一个正整数 $n$。
输出 $2n - 1$ 行,表示按要求画的菱形。
1
2
3
4
5
6
7
...+...
..+.+..
.+...+.
+.....+
.+...+.
..+.+..
...+...
$3 \le n \le 15$。
本题的解题思路如下:
+ 表示,其余用 . 表示+ 出现在第 $n-1-i$ 列和第 $n-1+i$ 列+(菱形的上下顶点)通过判断每个位置与菱形中心的曼哈顿距离是否等于 $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),考试认证学员交流,互帮互助
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。