例 编写程序,输入一个n,打印n阶菱形,n是奇数
如,当n = 9时,输出以下图形:
首先,简单介绍一下什么是曼哈顿距离:两点间的曼哈顿距离 = | x1 - x2 | + | y1 - y2 |
区分:两点间的距离为sqrt( (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) )
分析:
通过上图可以看出,要想打印五阶菱形,只需要找出所有与原点的曼哈顿距离小于或等于2的点
由于(5 / 2 = 2),通过总结/猜想,可以得出,要想打印出n阶菱形,只需要将与原点距离的曼哈顿距离为小于等于 n/2(向下取整)的点打上*即可。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
//取cx和cy设为中心点坐标
int cx = n / 2;
int cy = n / 2;
//从(0,0)开始寻找与中心点的曼哈顿距离小与等于n / 2的点
for (int x = 0;x <= n;x ++)
{
for (int y = 0;y <= n;y ++)
{
if (abs(x - cx) + abs(y - cy) <= n / 2)
{
cout << "*";
}
else
{
cout << " ";
}
}
//每一行输入完成之后换到下一行
cout << endl;;
}
}
代码演示 ①:
代码演示 ②:
代码演示 ③:
注意:控制台输入的n必须为奇数
思考:若想将上述菱形挖空,应该如何做?
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
//取cx和cy设为中心点坐标
int cx = n / 2;
int cy = n / 2;
//从(0,0)开始寻找与中心点的曼哈顿距离小与等于n / 2的点
for (int x = 0;x <= n;x ++)
{
for (int y = 0;y <= n;y ++)
{
//只有当曼哈顿距离等于n / 2时,输入 *
if (abs(x - cx) + abs(y - cy) == n / 2)
{
cout << "*";
}
else
{
cout << " ";
}
}
//每一行输入完成之后换到下一行
cout << endl;;
}
}
即只需要更改代码if (abs(x - cx) + abs(y - cy) == n / 2)
展示效果: