知识要点
首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走AC和 CB才能到达,由于街道很规则,ACB就像一个直角3角形,AB是斜边,AC和CB是直角边,根据毕达格拉斯(勾股)定理,或者向量理论,都可以知道用AC和CB可以表达AB的长度。
在早期的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂贵,很慢而且有误差,如果直接使用AB的距离,则必须要进行浮点运算,如果使用AC和CB,则只要计算加减法即可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。因此,计算机图形学就借用曼哈顿来命名这一表示方法。
曼哈顿距离:两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离。
通过分析下面的题目,可知其可以应用曼哈顿距离计算至(1,1)点最近的点,依据曼哈顿距离即可计算出结果值。
代码如下:
1 /** 2 * 解救小易 3 有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。 4 大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。 5 你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。 6 输入描述: 7 第一行为一个整数n(n ≤ 1000),表示超超一共拥有n个陷阱。 8 第二行有n个整数xi,表示第i个陷阱的横坐标 9 第三行有n个整数yi,表示第i个陷阱的纵坐标 10 保证坐标都在草地范围内。 11 12 输出描述: 13 输出一个整数,表示小易最少可能多少秒就落入超超的陷阱 14 15 输入例子: 16 3 17 4 6 8 18 1 2 1 19 输出例子: 20 3 21 思路: 22 计算最短距离 23 */ 24 25 #include <iostream> 26 #include <vector> 27 using namespace std; 28 29 int main(void){ 30 int trapNum; 31 32 while (cin >> trapNum){ 33 if (trapNum <= 0 || trapNum > 1000) 34 continue; 35 // vector<int> dx; 36 // vector<int> dy; 37 vector<int> dx(trapNum);//指定容器大小,否则会溢出 38 vector<int> dy(trapNum); 39 for (int i = 0; i < trapNum; i++) 40 cin >> dx[i]; 41 for (int i = 0; i < trapNum; i++) 42 cin >> dy[i]; 43 44 int result = 99999; 45 //枚举一遍维护最小值 46 for (int i = 0; i < trapNum; i++){ 47 int length = (dx[i] - 1) + (dy[i] - 1); 48 if (length < result) 49 result = length; 50 } 51 cout << result << endl; 52 } 53 return 0; 54 }