曼哈顿距离

例 编写程序,输入一个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)

  展示效果:

  

 

 

  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值