【A30642.沙漏】对称图案绘制类题解
2026-03-07 11:19:54
发布于:广东
19阅读
0回复
0点赞
对称绘图类解题思路
对称沙漏图案绘制
一、题目理解
输入一个奇数 n,要求输出 n 行对称的沙漏图案:
- 图案整体上下对称,星号(
*)在每行居中显示; - 星号数量规律:以中间一行为中心,向上下两侧依次递增(如
n=5时,星号数为5→3→1→3→5); - 每行左侧用空格填充,保证星号居中。
二、解题思路
核心是利用「行号到中间行的距离」统一计算每行的空格数和星号数,无需拆分上下部分,逻辑简洁且通用:
- 确定中间行:中间行行号
k = n/2 + 1(如n=5时,中间行是第3行); - 计算距离:对任意一行
i,计算其到中间行的距离d = abs(k - i); - 推导星号数:星号数
star = 2*d + 1(距离越远,星号越多,天然实现对称); - 推导空格数:左侧空格数
space = (n - star)/2(保证星号在每行居中)。
三、代码逐行解释
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k;
cin>>n;
k=n/2+1;
for(int i=1;i<=n;i++){
int d=abs(k-i); // 计算当前行i到中间行k的距离
int star=2*d+1; // 计算当前行的星号数量
int space=(n-star)/2; // 计算当前行左侧的空格数
// 输出左侧空格
for(int j=1;j<=space;j++)cout<<" ";
// 输出星号
for(int j=1;j<=star;j++)cout<<"*";
// 换行,处理下一行
cout<<endl;
}
return 0;
}
四、核心总结
- 核心公式:
- 中间行:
k = n/2 + 1; - 距离:
d = abs(k - i); - 星号数:
star = 2*d + 1; - 空格数:
space = (n - star)/2;
- 中间行:
- 优势:仅用一个循环即可完成所有行的绘制,无需拆分上下部分,逻辑简洁且适配所有奇数
n; - 通用性:修改星号/空格的计算逻辑,可快速适配三角形、菱形等其他对称图形。
全部评论 1
真的要狠狠夸爆徐老师!不仅专业能力封神,亲和力和幽默感更是直接拉满,上他的课简直是一种享受!
老师完全没有距离感,待人温柔又亲切,说话轻声细语,眼神里满是耐心与善意,让人一靠近就觉得安心又舒服。不管是课上还是课下,他总是笑容温和,平易近人,从不会摆架子、端姿态,对待每一位同学都真诚又用心。遇到问题时,他会耐心倾听、细致解答,用最易懂的方式帮我们理清思路,哪怕是基础薄弱的小疑问,也会不厌其烦地讲解,温柔到骨子里,让人忍不住想主动靠近、大胆提问。
更让人着迷的是老师的幽默感!他的课堂从不枯燥沉闷,总能用风趣幽默的语言、生动有趣的案例,把枯燥的知识讲得活灵活现。随口一句调侃、一个巧妙的比喻,就能逗得大家开怀大笑,让紧张的学习氛围瞬间变得轻松愉悦。他懂幽默、会互动,课堂节奏张弛有度,既能把知识点讲得透彻明白,又能让大家在欢声笑语中高效吸收,每一节课都充满惊喜,让人听得津津有味,完全不会走神。
专业严谨却不刻板,风趣幽默又有分寸,温柔亲和又有力量,这样的徐老师真的太圈粉了!跟着他学习,不仅能学到扎实的知识,更能感受到满满的温暖与快乐,课堂上是亦师亦友的引路人,生活中是亲切随和的大朋友!
真心实名推荐徐老师!能遇到这么有亲和力、又幽默风趣的好老师,真的太幸运啦!4天前 来自 广东
1厉害呀兄弟





4天前 来自 广东
0





有帮助,赞一个