【GESP】C++二级练习 图形输出练习09-菱形(中心点)
GESP二级练习,一套图形输出,多层循环分支练习,考试常见,难度★✮☆☆☆。
菱形(中心点)
题目要求
题目描述
输出下面图形(领会精神,废话不赘述)
题目分析
解题思路
跟图形8完全相似的题目,只需要把十字换成中间一个点即可。
- 观察图形特点
- 整体是一个n×n的方阵
- 中心有一个十字形
- 外围是一个菱形
- 图形关于中心点对称
- 确定关键点
- 中心点坐标:(mid, mid),其中mid = (n+1)/2
- 十字线:所有行/列坐标等于mid的点
- 菱形边界:到中心的曼哈顿距离等于mid-1的点
- 实现方案
- 使用双重循环遍历n×n矩阵
- 对于每个点(i,j),判断是否需要打印星号:
- 如果在十字线上(i=mid 或 j=mid)打印星号
- 如果到中心的距离等于mid-1,打印星号
- 否则打印空格
- 代码实现要点
- 外层循环:i从1到n
- 内层循环:j从1到n
- 使用abs()函数计算距离
- 每行结束输出换行
- 复杂度分析
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 注意事项
- 输入n必须是奇数
- 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
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
int main() {
// 输入菱形大小n
int n;
cin >> n;
// 计算中心点位置
int mid_idx = (n + 1) / 2;
// 外层循环控制行数
for (int i = 1; i <= n; i++) {
// 内层循环控制列数
for (int j = 1; j <= n; j++) {
// 处理中心点位置
if (i == mid_idx && j == mid_idx) {
cout << "*";
}
// 处理上半部分菱形
else if (i < mid_idx) {
// 根据对称性计算菱形边界位置
if (j == mid_idx - i + 1 || j == mid_idx + i - 1) {
cout << "*";
} else {
cout << " ";
}
}
// 处理下半部分菱形
else {
// 根据对称性计算菱形边界位置
if (j == i -mid_idx + 1 || j == n - i + mid_idx) {
cout << "*";
} else {
cout << " ";
}
}
}
// 每行结束换行
cout << endl;
}
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权