本文最后更新于 960 天前,其中的信息可能已经有所发展或是发生改变。
原题链接
描述
输入一个奇数 n,输出一个由 * 构成的 n 阶实心菱形。
输入格式
一个奇数 n。
输出格式
输出一个由 * 构成的 n 阶实心菱形。
具体格式参照输出样例。
数据范围
1≤n≤99
输入样例:
输出样例:
分析:
规律寻找
1.观察法
2.利用曼哈顿距离
- 以中心点向边界打印,打印输出曼哈顿距离
l <= (n-1)/2
的点
曼哈顿距离:矩阵任意一点只通过横向或纵向移动到达中心点的距离
计算公式:x(x1,y1)
到中心点m(x2,y2)
| l = abs(x1-x2) + abs(y1-y2) |
代码
1.观察法解:
| #include <bits/stdc++.h> |
| using namespace std; |
| int main() |
| { |
| int n; |
| cin>>n; |
| for(int i=1,k=1;i<=n;i++){ |
| |
| for(int j=1;j<=(n+1)/2-k;j++){ |
| cout<<" "; |
| } |
| for(int j=0;j<k*2-1;j++){ |
| cout<<"*"; |
| } |
| cout<<endl; |
| if(i>=(n+1)/2){ |
| k--; |
| } |
| else k++; |
| } |
| |
| return 0; |
| } |
2.曼哈顿解:
| |
| #include <bits/stdc++.h> |
| using namespace std; |
| int main() |
| { |
| int n; |
| cin>>n; |
| for(int i=1;i<=n;i++){ |
| for(int j=1;j<=n;j++){ |
| if(abs((n+1)/2-i)+abs((n+1)/2-j)<=(n-1)/2){ |
| cout<<"*"; |
| } |
| else cout<<" "; |
| } |
| cout<<endl; |
| } |
| return 0; |
| } |
扩展:只打印边框,不打印内部的空心菱形
例题:ZZULIOJ 1077: 空心菱形 原题链接
分析:
代码:
| #include <bits/stdc++.h> |
| using namespace std; |
| int main() |
| { |
| int n; |
| cin>>n; |
| for(int i=1;i<=n;i++){ |
| for(int j=1;j<=n;j++){ |
| if(abs((n+1)/2-i)+abs((n+1)/2-j)==(n-1)/2){ |
| cout<<"*"; |
| } |
| else cout<<" "; |
| } |
| cout<<endl; |
| } |
| return 0; |
| } |