Leetcode3001:捕获黑皇后需要少移动次数

发布于:2024-12-18 ⋅ 阅读:(9) ⋅ 点赞:(0)

题目描述:

现有一个下标从 1 开始的 8 x 8 棋盘,上面有 3 枚棋子。

给你 6 个整数 a 、b 、c 、d 、e 和 f ,其中:

  • (a, b) 表示白色车的位置。
  • (c, d) 表示白色象的位置。
  • (e, f) 表示黑皇后的位置。

假定你只能移动白色棋子,返回捕获黑皇后所需的最少移动次数。

请注意

  • 车可以向垂直或水平方向移动任意数量的格子,但不能跳过其他棋子。
  • 象可以沿对角线方向移动任意数量的格子,但不能跳过其他棋子。
  • 如果车或象能移向皇后所在的格子,则认为它们可以捕获皇后。
  • 皇后不能移动。

代码思路:

这个代码的目的是解决一个与国际象棋相关的问题:给定皇后的位置 (a, b) 和国王的位置 (e, f),以及国王可以移动的三个方向上的障碍物的位置 (c, d),计算国王移动到可以捕获皇后的位置所需的最小步数。国王每次可以移动到相邻的格子(水平、垂直或对角线方向),但不能穿过障碍物。

代码中的思路可以分解为以下几个步骤:

  1. 定义辅助函数
    • sameLine(x, y, u, v, s, t):检查从点 (x, y) 到点 (s, t) 的直线上是否经过点 (u, v) 并且确保 (y, t) 在 (v, y) 的两侧(即 yvt 不在同一边)。这是为了判断国王和皇后是否在同一直线上,并且这条直线是否被障碍物阻挡。
    • sameDiag(x, y, u, v, s, t):检查从点 (x, y) 到点 (s, t) 的对角线上是否经过点 (u, v),并且确保 (y, t) 在 (v, y) 的两侧。这是为了判断国王和皇后是否在同一对角线上,并且这条对角线是否被障碍物阻挡。
  2. 判断特殊情况
    • 如果皇后和国王在同一行且不在障碍物的直线上,即 (a == e) 且 sameLine(a, b, c, d, e, f) 返回 False,则国王可以直接移动到皇后的位置,所需步数为 1
    • 如果皇后和国王在同一列且不在障碍物的直线上,即 (b == f) 且 sameLine(b, a, d, c, f, e) 返回 False,则国王可以直接移动到皇后的位置,所需步数为 1
    • 如果皇后和国王在同一对角线上且不在障碍物的对角线上,即 abs(c-e) == abs(d-f) 且 sameDiag(c, d, a, b, e, f) 返回 False,则国王可以直接移动到皇后的位置,所需步数为 1
  3. 默认情况
    • 如果上述特殊情况都不满足,那么国王不能直接移动到皇后的位置,需要至少两步(先绕过障碍物,再移动到皇后)。因此,返回 2

总结:

  • 代码通过检查国王和皇后是否在同一直线或对角线上,并且这条路径是否被障碍物阻挡,来判断国王是否可以直接移动到皇后的位置。
  • 如果可以直接移动,返回 1;否则,返回 2

代码实现:

class Solution(object):
    def minMovesToCaptureTheQueen(self, a, b, c, d, e, f):
        """
        :type a: int
        :type b: int
ee        :type d: int
        :type e: int
        :type f: int
        :rtype: int
        """
        def sameLine(x,y,u,v,s,t):
            return x==u==s and (y<v<t or y>v>t)
            
        def sameDiag(x,y,u,v,s,t):
            return (u-s)*(y-t)==(v-t)*(x-s) and (y<v<t or y>v>t)
        
        return 1 if (a==e and not sameLine(a,b,c,d,e,f)) or (b==f and not sameLine(b,a,d,c,f,e)) or (abs(c-e)==abs(d-f) and not sameDiag(c,d,a,b,e,f)) else 2