这道题第一眼感觉是找规律题,但是这呈指数级的增长实在看的眼花缭乱后来,后来终于寻得了题解,原来还有这么高级的找规律。
如果在这里看不懂,给你指条明路:链接https://www.cnblogs.com/EchoZQN/p/14829144.html
一开始看见题解,想这是啥呀全是数字,我的天,后来用大佬的代码提交试了一下,不仅过了,而且速度贼快,于是带着崇拜的心情来看这些黑乎乎的数字。
我先讲讲大面上的思路,细节的思路看下面的手稿。
首先将两点之间的距离变成两点与原点距离的差值。然后
大佬把地图分成了下面的九块,先不要想为什么这么分,看就行。下面的图也上上面的链接网站里的图。
然后确定(x,y)点在这九块中的哪一块,这个怎么确定呢?直接看坐标,我们可以求出地图的长和宽都是len,假设(x,y)在第5块,那么x必然大于len/3,小于len/32,y也是如此,由此就知道了(x,y)在哪一块了,其它的也是同样道理。(如果还不懂,欢迎私信)
确定完之后呢?我们就缩小地图,只把目光放在(x,y)所在的地图块上,怎么缩小?这就是为什么分块的原因了。
假设k,地图是3的k次方,k每次减1,地图就相应变小,3k ,3k-1,啊这,我对这两个指数幂没啥概念,还是举个具体的例子吧。假设K是3吧,一开始地图是2727大小的,k-1后就变成了99大小的,而这个99刚好是27*27的九分之一大小,这就是分成九分的原因,因为k-1后地图变成了原来的九分之一,我要确定这个点落在了哪一个九分之一上,这样还是假设我落在了第五块,我缩小之后我是要求距离的,我们求的是大图的距离,我们要在一步步缩小地图的时候求距离。第五块的话,我在大图上经过了1,2,3,4块,这样我就要先加上这几块的总距离,然后再以同样的办法处理缩小了的地图。注意缩小了的地图下表是从0开始的,所以我还要修改原来的坐标,这个看图修改就行了,如果在第五块,我求出第五块的起始坐标,然后相减就可以了,注意不要减除负的来。为什么要减起始坐标,因为我们的(x,y)都是在以起始坐标为坐标原点的数轴上的。可能有的块起始坐标在(x,y)上面,没关系,反正这个坐标求的是(x,y)分别在x轴和y轴上距离坐标原点的距离,你就把起始坐标想象成坐标原点,就会容易理解了。
注意这是一个循环,每次(x,y)坐标变换一次,k都会减1,直到k等于0.
这个的思路就是分块去看,化整为零,不一次求出它的距离,而是不断缩小地图去一点一点求距离。距离也不是一步步走着求出来的,而是化零为整,一开始是一块一块去走的。
十分膜拜!!!!!!!!!!!!!!!!!!!!!!!!
以上是我个人的理解,欢迎指正,下面是具体的判断(x,y)在哪一块的过程
如果对算法问题有疑问,欢迎来 落花君 公众号。一起探讨算法的乐趣。