小欧获得了国际象棋中“象”和”马”的能力,她在一个无穷大的平面直角坐标系中,每一步可以效仿国际象棋中 的”象”和”马”跳一步。
如下图,小红初始坐标为$(x,y)$时,只跳一步时可以跳到以下
1.$(x+k,y+k)$,$k$是任意整数。
2.$(x+k,y-k)$,$k$是任意整数。
3.$(x+a,y+b)$.其中$|a|+|b|=3$且$1<=a,b<=2.$
小欧想知道,自己初始坐标为$x1,y1,$他跳到$x2,y2$最少需要跳多少步?共有t次询问
输入描述
第一行输入一个整数$t(1<=t<=100)$表示询问组数
接下来$t$行,每行四个整数$x1,y1,x2,y2$
$-10^9<=x1,y1,x2,y2<=10^9$
输出描述
一个整数,代表最小的步数。
示例:
1 |
分析:
难度:中等
- 方法 一:数学 时间复杂度O(t)
1 | 如果两点之间的 x 和 y 的差值为奇数,那么它们之间的 Manhattan 距离一定是 3,可以通过象走法到达;如果差值为偶数,那么 Manhattan 距离一定是 2,可以通过马走法到达。因此,在这个问题中,我们可以直接计算两点之间的 x 和 y 的差值,然后根据差值的奇偶性判断最少需要多少步才能到达另一个点。 |
- 方法二:BFS
1 | (BFS)遍历所有可能的路径,直到找到最短路径为止。为了实现马和象的走法,我们需要分别对马和象进行遍历。在遍历时,我们使用了一个 dist 哈希表来记录每个点到起点的最短距离,如果一个点没有被遍历过,我们就将其放入队列中,并更新其距离。最后返回终点的距离即可。 |
代码
1 |
|
- java
1 | import javax.swing.plaf.synth.SynthTextAreaUI; |
- Python
1 | t = int(input()) |
- Golang
1 | package main |
- BFS
1 | package main |