刷题使我快乐,满脸开心.jpg

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode.cn/problems/minimum-moves-to-capture-the-queen/
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

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

给你 6 个整数 abcdef ,其中:
(a, b) 表示白色车的位置。
(c, d) 表示白色象的位置。
(e, f) 表示黑皇后的位置。
假定你只能移动白色棋子,返回捕获黑皇后所需的最少移动次数。

请注意:

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

示例 1:

输入:a = 1, b = 1, c = 8, d = 8, e = 2, f = 3
输出:2
解释:将白色车先移动到 (1, 3) ,然后移动到 (2, 3) 来捕获黑皇后,共需移动 2 次。
由于起始时没有任何棋子正在攻击黑皇后,要想捕获黑皇后,移动次数不可能少于 2 次。

示例 2:

输入:a = 5, b = 3, c = 3, d = 4, e = 5, f = 2
输出:1
解释:可以通过以下任一方式移动 1 次捕获黑皇后:
- 将白色车移动到 (5, 2) 。
- 将白色象移动到 (5, 2) 。

提示:

  • 1 <= a, b, c, d, e, f <= 8
  • 两枚棋子不会同时出现在同一个格子上。

思路

这道题是中等其实可能就在于能否跳出复杂的问题,发现最基本的一个规律:

无论何种情况,均能在两步内捕获到皇后

那么再往下顺着想就简单多了,什么时候能一步捕获到?

直接就能攻击到

但有个特殊情况就是遇到遮挡时还是得两步

代码基本就出来了,分情况讨论

代码

func minMovesToCaptureTheQueen(a int, b int, c int, d int, e int, f int) int {
    // 遇到遮挡的四种情况
	if (a == c && a == e && ((b > d && d > f) || (b < d && d < f))) ||
		(b == d && b == f && ((a > c && c > e) || (a < c && c < e))) ||
		((a+b) == (c+d) && (a+b) == (e+f) && ((d > b && b > f) || (d < b && b < f))) ||
		((a-b) == (c-d) && (a-b) == (e-f) && ((d > b && b > f) || (d < b && b < f))) {
		return 2
        // 没有遮挡时,恰好能直接捕获的四种情况
	} else if (a == e) ||
		(b == f) ||
		((c + d) == (e + f)) ||
		((c - d) == (e - f)) {
		return 1
	}
    // 其他情况,车一定能在2步捕获到
	return 2
}