题目描述
输入一个奇数n,输出一个由‘*’构成的n阶实心菱形。
样例
*
***
*****
***
*
算法
中心距离
上图示例输入为5时的情况。无论打印什么样的菱形,总是会出现相似的结构。
对于输入的每个奇数n,(n/2, n/2)这个坐标表示n*n方阵中的中心点。
打印‘*’的判断条件是abs(i - n/2) + abs(j - n/2) <= n/2
。
观察图中我们打印菱形的点对应的坐标。
菱形即为与此n*n方阵中心点距离不超过n/2的所有点的集合。中心点所在的横纵方向的点以及周围点均满足与中心点距离不超过n/2。
C++ 代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int cx = n / 2, cy = n / 2;
//定位中点的坐标
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
if (abs(i - cx) + abs(j - cy) <= n / 2) cout << '*';
//i和j是距离中点的x轴和y轴的距离
else cout << ' ';
cout << endl;
}
return 0;
}
二维平面上,对于坐标分别为(x1 , y1)和(x2 , y2)的两点 p、q,它们之间的曼哈顿 距离为 | x1 - x2 | + | y1 - y2 |
菱形的“*”的点都是和 中心点(n/2,n/2)的曼哈顿距离小于n/2的点
感谢,想明白了
不是自己写的,我给自己看的