leetcode-3001


题目

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

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

    • (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
    • 两枚棋子不会同时出现在同一个格子上。

分析

  • 已知 象可以在对角方向上任意移动、车可以在水平或垂直方向上任意移动,皇后不能移动。象车不能会被对方阻碍。
  • 那么不考虑阻碍的情况下,象、车只需要两次运动就可以到达全棋盘的任意位置。
  • 另外,存在一种可能,皇后就在象或者车的第一次运动路线上,那么只需要一次运动就可以到达皇后的位置。
  • 所以问题变成,需要一次运动还是两次运动。
    • 一次:象车的第一次运动路线上存在皇后并且不会被对方阻碍。
    • 两次:象车的初始位置不能直接到达皇后的位置,或者象车的第一次运动路线上存在对方的棋子。
  • 时间复杂度不超过 O(1)。因为棋盘大小固定,8*8

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main

import "math"

/*
* @lc app=leetcode.cn id=3001 lang=golang
*
* [3001] 捕获黑皇后需要的最少移动次数
*/

// @lc code=start
//最多两次
func MinMovesToCaptureTheQueen(a int, b int, c int, d int, e int, f int) int {
ans := 2
// 车和皇后在同一条直线上
if a == e || b == f {
ans = 1
if a == e && c == e {
if b < d && d < f {
ans = 2
} else if f < d && d < b {
ans = 2
}
} else if b == f && d == f {
if a < c && c < e {
ans = 2
} else if e < c && c < a {
ans = 2
}
}
// 象和皇后在同一对角线上
} else if int(math.Abs(float64(c-e))) == int(math.Abs(float64(d-f))) {
ans = 1
row := (c - e) / (int(math.Abs(float64(c - e))))
col := (d - f) / int(math.Abs(float64(d-f)))
for c != e {
c -= row
d -= col
if c == a && d == b {
ans = 2
break
}
}

}
return ans
}

// @lc code=end

作者

Norton-Lin

发布于

2024-12-05

更新于

2024-12-06

许可协议

评论