727-菱形-曼哈顿距离
729. 菱形 (曼哈顿距离)
描述
输入一个奇数 n,输出一个由 * 构成的 n 阶实心菱形。
输入格式
一个奇数 n。
输出格式
输出一个由 * 构成的 n 阶实心菱形。
具体格式参照输出样例。
数据范围
1≤n≤99
输入样例:
plaintext
5输出样例:
plaintext
*
***
*****
***
*分析:
- 循环 n 次,每一行按照规律打印
" "和"*"
规律寻找1. 观察法
- 以
(n+1)/2处为分界线分别向上下延伸打印输出。
- 利用曼哈顿距离
- 以中心点向边界打印,打印输出曼哈顿距离
l <= (n-1)/2的点。
曼哈顿距离:网格中任意一点只通过横向或纵向移动到达中心点的距离。
计算公式:点x(x1, y1)到中心点m(x2, y2)的曼哈顿距离为plaintextl = abs(x1 - x2) + abs(y1 - y2)
代码1. 观察法解:
cpp
#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;
}- 曼哈顿解:
cpp
// 曼哈顿解
#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: 空心菱形
原题链接
分析:
- 打印曼哈顿距离
== (n - 1) / 2的"*"
代码:
cpp
// 代码根据上述分析编写,此处省略