1219. 移动距离
这道题实际上是让我们按照蛇形排列一个二维数组,然后给定m,n两个点,求m,n之间最短距离。
我们正常的二维数组是这样的:
按照蛇形排列的话就需要把偶数行给反转一下:
现在我们先做一个操作:让序列号都减1,即下标从0开始,如图:
为什么要这样做,马上就会知道。
我们现在求一下题目给的题目给的两个楼号m,n的坐标。
求行号
题目给定一个宽度w,假设这个宽度是6,那么就可以画出下面这个图:
规律:
(第0行的数) / w= 0
(第1行的数) / w =1 ……
按照这个进行递推,我们就可以得出每一行的行号,现在我们相求m,n的行号可以用如下来表达:
rowm=m/w rown=n/w
此时让下标从0开始的好处就体现出来了,倘若从1开始,那么第0行就没法体现了。
求列号
求列号我们怎么求呢?
规律:
(第0列的数) % w= 0
(第1列的数) % w =1
m,n的列号可以用如下来表达:
colm=m%w coln=n%w
知道了行号,知道了列号就可以求出m,n的坐标,求出m,n的坐标就可以套用公式求出它们之间的距离。
套公式求两点距离
我们求两点之间距离一般用两个公式:欧几里得公式,曼哈顿公式
欧式定理
欧几里得公式也叫欧式定理,用来求两点之间最短距离:
我们都知道两点之间直线最短,所以欧式定理适合于求可以直接走直线最短距离的场景:
公式:
曼哈顿定理
曼哈顿定理适合用于没办法直接求两点之间直接走直线到达的情况,例如一个十字路口到达另一个十字路口:
公式:
欧式定理和曼哈顿定理区别:
根据题目给定的测试用例我们发现本题适合用曼哈顿定理来求m,n之间最短距离:
总结
- 首先输入二维数组,但是遇到奇数行的话需要反转一下,怎么反转呢?
反转行
如下图,现在想反转7,12:
我们可以用 w(6)-7的下标记(0)-1=5(正好是12的下标) 再用 w(6)-12的下标(5)-1=0 (正好是7的下标)
这样就可以通过下标在输入的时候来完成反转:
最终可以得到一个反转之后的行:
-然后求出m,n的坐标,然后再用曼哈顿定理求m,n之间的最短距离