138. 国际象棋跳跃问题 解析 | 豆包MarsCode AI刷题

111 阅读3分钟

题目大意

在一个无限大的平面直角坐标系中,以国际象棋中象和马的跳跃方式从 (x1,y1)(x1,y1) 移动到 (x2,y2)(x2,y2) 所需的最少步数。

  • 象的跳跃:可以移动到 (x+k,y+k)(x+k,y+k) 或 (x+k,yk)(x+k,y−k),其中 kk 是任意整数。
  • 马的跳跃:可以移动到 (x+a,y+b)(x+a,y+b),其中 a+b=3|a|+|b|=3 且 1a,b21≤|a|,|b|≤2

测试样例及解释

样例1:

输入:x1 = 0, y1 = 0, x2 = 1, y2 = 1
输出:1

以象的跳跃方式移动一次即可。

样例2:

输入:x1 = 0, y1 = 0, x2 = 2, y2 = 1
输出:1

以马的跳跃方式移动一次即可。

样例3:

输入:x1 = 0, y1 = 0, x2 = 3, y2 = 3
输出:1

以象的跳跃方式移动一次即可。

样例4:

输入:x1 = -3, y1 = -2, x2 = 2, y2 = 1
输出:2

以象的跳跃方式先一步跳跃至 (1,2)(1,2) ,再跳跃至 (2,1)(2,1) 即可。

解题思路

  1. 这是一道比较有意思的结论题。刚读完题面我以为这道题就是一个 bfs 搜索,但很快发现事情没有那么简单:平面是无限大的,而象一次可以跳跃的距离也是无限大的,因此无法判断跳跃距离的边界。

  2. 首先对于所有 一步 就可以到达的位置是非常好判断的:只要根据题目描述的象与马的跳跃方式进行判断即可。

  3. 接下来是对 两步 可以到达的位置:如果观察过国际象棋的棋盘,就可以发现国际象棋的象无论怎么移动,其所处位置的颜色一定与初始位置相同,即如果其一开始在黑色格子上,那么它经过若干次移动之后,依然只可能在某个黑色格子上。对应到这个无限大的平面直角坐标系则是其横纵坐标之和的奇偶性保持不变;且由于平面无限大,任意横纵坐标之和相同的格子均可以在两步之内抵达。 这是两次以象的跳跃方式进行的移动。

  4. 相反的,国际象棋的马每一次跳跃一定会移动到格子颜色不同的位置。因此,两次以象的跳跃方式进行的移动最终也会移动到与开始位置颜色相同的格子中,从而完全被包含于两次以象的跳跃方式进行的移动中,故而不考虑这种移动方式。

  5. 那么一次以马的方式跳跃一次以象的方式跳跃呢?首先这两次跳跃的顺序并不影响结果,我们不妨认为先进行马的跳跃再进行象的跳跃;马的跳跃可以移动到附近八个位置,而象的跳跃可以移动到所有横纵坐标差的绝对值相同的位置,因此我们可以枚举第一次马的跳跃的位置然后判断是否可以通过象的跳跃到达终点即可。

  6. 如果以上情况都无法到达终点的话,那么就一定需要 三步 了:不妨令起点为一个黑色点,那么所有黑色点都可以在 2 步内到达;所有白色点可以通过两次到达的某一黑色点再进行一次马的跳跃到达,因此答案一定不会超过三。

tips: 其实也可以不枚举第 5 点中马跳跃的位置,我们假设 p=x1y1,q=x2y2p=|x1-y1|,q=|x2-y2| ,那么只要 pq=1|p-q|=1pq=3|p-q|=3 就是可以的,具体可以画一画图理解。