GESP2级模拟题
题目:
小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 n 行 n 列的字符画,n 是一个大于 1 的奇数。菱形的四个顶点依次位于第 1 行、第 1 列、第 n 行、第 n 列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .
..#..
.#.#.
#...#
.#.#.
..#..
给定 n,请你帮小 A 绘制对应的菱形。
输入描述
一行,一个正整数 n。
输出描述
输出共 n 行,表示对应的菱形。
以下为实例输入(输出)
用例输入 1
3
用例输出 1
.#. #.# .#.
1.首先分解题目(一句一句的拆,慢慢来)
1.绘制菱形
2.需要绘制的菱形是一个 n 行 n 列的字符画
3.n 是一个大于 1 的奇数
4.菱形的四个顶点依次位于第 1 行、第 1 列、第 n 行、第 n 列的正中间,使用#绘制
5.其余都用‘.’
2.建立基本内容,包括头文件,main函数,返回值。
#include<iostream>
using namespace std;
int main() {
return 0;
}
3.建立变量n和判断中间的mid
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
int mid = n / 2;
return 0;
}
4.搭建for循环
for (int i = 0;i <= n;i++){
for (int j = 0;j <= n;j++){
}
}
5.运用绝对值abs完成判断并输出
int dist = abs(i - mid) + abs(j - mid);
if (dist == mid) {
cout << '#';
} else {
cout << '.';
(不要忘了abs头文件)
#include <cstdlib>
6.换行输出
cout << endl;
———————————————————————————————————————————
这时有人问了:
浏览者:第五个看不懂怎么办,能不能解析一下。
1. 变量含义
-
i:当前行号(从 0 开始) -
j:当前列号(从 0 开始) -
mid:中心点的索引,mid = n / 2(因为 n 是奇数,所以中心点恰好是整数位置)
2. 数学意义
abs(i - mid) 表示当前行到中心行的垂直距离abs(j - mid) 表示当前列到中心列的水平距离
两者相加,得到的就是从点 (i, j) 到中心点 (mid, mid) 的曼哈顿距离。
3. 为什么用曼哈顿距离判断菱形边界?
对于中心在 (mid, mid) 的菱形,其边界上的点到中心的曼哈顿距离是一个固定值,这个值就是 mid。
验证:
-
顶点 (0, mid):距离 = |0-mid| + |mid-mid| = mid ✅
-
顶点 (mid, 0):距离 = |mid-mid| + |0-mid| = mid ✅
-
顶点 (n-1, mid):距离 = |n-1-mid| + |mid-mid| = mid ✅
-
顶点 (mid, n-1):距离 = |mid-mid| + |n-1-mid| = mid ✅
-
边上其他点:距离也都等于 mid
而菱形内部或外部的点,曼哈顿距离不等于 mid。
4. 判断逻辑
if (dist == mid) {
cout << '#';
} else {
cout << '.';
}
-
如果
dist == mid,说明这个点恰好在菱形的边界上,画# -
否则画
.
5. 举例 n=5,mid=2
| 位置 (i,j) | |i-2| | |j-2| | dist | 是否边界 |
|---|---|---|---|---|
| (0,2) | 2 | 0 | 2 | ✅ 是 |
| (1,1) | 1 | 1 | 2 | ✅ 是 |
| (1,3) | 1 | 1 | 2 | ✅ 是 |
| (2,0) | 0 | 2 | 2 | ✅ 是 |
| (2,2) | 0 | 0 | 0 | ❌ 否 |
| (0,0) | 2 | 2 | 4 | ❌ 否 |
这正是我们需要的菱形边界。
最后完整代码如下 |
|
\ | /
\ | /
#include <iostream>
#include <cstdlib> // 包含 abs 的整数版本
using namespace std;
int main() {
int n;
cin >> n;
int mid = n / 2;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int dist = abs(i - mid) + abs(j - mid);
if (dist == mid) {
cout << '#';
} else {
cout << '.';
}
}
cout << endl;
}
return 0;
}
再见!!!!!!!!!!!!!!!!!
更多推荐

所有评论(0)