【GESP】C++二级真题 luogu-B4412 [GESP202509 二级] 菱形

GESP C++ 2025年9月二级真题,多层循环练习,难度★✮☆☆☆。

luogu-B4412 [GESP202509 二级] 菱形题目要求题目描述小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 $n$ 行 $n$ 列的字符画,$n$ 是一个大于 $1$ 的奇数。菱形的四个顶点依次位于第 $1$ 行、第 $1$ 列、第 $n$ 行、第 $n$ 列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .。

例如,一个 $5$ 行 $5$ 列的菱形字符画是这样的:

1

2

3

4

5

..#..

.#.#.

#...#

.#.#.

..#..

给定 $n$,请你帮小 A 绘制对应的菱形。

输入格式一行,一个正整数 $n$。

输出格式输出共 $n$ 行,表示对应的菱形。

输入输出样例 #1输入 #1 1

3

输出 #1 1

2

3

.#.

#.#

.#.

输入输出样例 #2输入 #2 1

9

输出 #2 1

2

3

4

5

6

7

8

9

....#....

...#.#...

..#...#..

.#.....#.

#.......#

.#.....#.

..#...#..

...#.#...

....#....

说明/提示对于所有测试点,保证 $3 \leq n \leq 29$ 并且 $n$ 为奇数。

题目分析本题要求输出一个 $n \times n$ 的“菱形”图案,$n$ 为奇数。每行每列只包含字符 # 和 .,# 组成菱形的边界,其余为 .。

核心思路确定中心位置 由于 $n$ 为奇数,中心行为 $\text{mid} = \frac{n+1}{2}$,中心列同理。

分行讨论首行和末行:只有中心列为 #,其余为 .。上半部分(第 $1$ 行到第 $\text{mid}-1$ 行):每行有两个 #,分别在:\(\begin{cases} \text{左斜线列号} = \text{mid} - i + 1 \\ \text{右斜线列号} = \text{mid} + i - 1 \end{cases}\)

中间行(第 $\text{mid}$ 行):只有首列和末列为 #。下半部分(第 $\text{mid}+1$ 行到第 $n$ 行):与上半部分对称,# 分别在:\[\begin{cases} \text{左斜线列号} = i - \text{mid} + 1 \\ \text{右斜线列号} = n - i + \text{mid} \end{cases}\]遍历输出 双重循环枚举每个位置,判断是否为 #,否则输出 .。复杂度分析时间复杂度 $O(n^2)$,空间复杂度 $O(1)$,$n \leq 29$ 时完全可行。细节注意行列编号从 $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

29

30

31

32

33

34

#include

int main() {

int n;

std::cin >> n; // 读入菱形边长(奇数)

int mid = (n + 1) / 2; // 计算中心行/列位置

for (int i = 1; i <= n; i++) { // 逐行绘制

for (int j = 1; j <= n; j++) { // 逐列绘制

if (i == 1 || i == n) { // 首行或末行:仅中心位置输出 #

if (j == mid) {

std::cout << "#";

} else {

std::cout << ".";

}

} else if (i < mid) { // 上半部分:对称的两条斜线

// 上半部分:左斜线列号 = 中心列 - 当前行 + 1,右斜线列号 = 中心列 + 当前行 - 1

if (j == mid - i + 1 || j == mid + i - 1) {

std::cout << "#";

} else {

std::cout << ".";

}

} else { // 下半部分:对称的两条斜线

// 左斜线列号 = 当前行 - 中心行 + 1,右斜线列号 = 总列数 - 当前行 + 中心行

if (j == i - mid + 1 || j == n - i + mid) {

std::cout << "#";

} else {

std::cout << ".";

}

}

}

std::cout << "\n"; // 换行进入下一行

}

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 认证学习微信公众号