comments | difficulty | edit_url | rating | source | tags | ||
---|---|---|---|---|---|---|---|
true |
中等 |
1796 |
第 379 场周赛 Q2 |
|
现有一个下标从 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
- 两枚棋子不会同时出现在同一个格子上。
根据题意,我们可以将捕获黑皇后的情况分为以下几种:
- 白色车和黑皇后在同一行,且中间没有其他棋子,此时只需要移动白色车
$1$ 一次; - 白色车和黑皇后在同一列,且中间没有其他棋子,此时只需要移动白色车
$1$ 一次; - 白色象和黑皇后在对角线
\
上,且中间没有其他棋子,此时只需要移动白色象$1$ 一次; - 白色象和黑皇后在对角线
/
上,且中间没有其他棋子,此时只需要移动白色象$1$ 一次; - 其他情况,只需要移动两次。
时间复杂度
class Solution:
def minMovesToCaptureTheQueen(
self, a: int, b: int, c: int, d: int, e: int, f: int
) -> int:
if a == e and (c != a or (d - b) * (d - f) > 0):
return 1
if b == f and (d != b or (c - a) * (c - e) > 0):
return 1
if c - e == d - f and (a - e != b - f or (a - c) * (a - e) > 0):
return 1
if c - e == f - d and (a - e != f - b or (a - c) * (a - e) > 0):
return 1
return 2
class Solution {
public int minMovesToCaptureTheQueen(int a, int b, int c, int d, int e, int f) {
if (a == e && (c != a || (d - b) * (d - f) > 0)) {
return 1;
}
if (b == f && (d != b || (c - a) * (c - e) > 0)) {
return 1;
}
if (c - e == d - f && (a - e != b - f || (a - c) * (a - e) > 0)) {
return 1;
}
if (c - e == f - d && (a - e != f - b || (a - c) * (a - e) > 0)) {
return 1;
}
return 2;
}
}
class Solution {
public:
int minMovesToCaptureTheQueen(int a, int b, int c, int d, int e, int f) {
if (a == e && (c != a || (d - b) * (d - f) > 0)) {
return 1;
}
if (b == f && (d != b || (c - a) * (c - e) > 0)) {
return 1;
}
if (c - e == d - f && (a - e != b - f || (a - c) * (a - e) > 0)) {
return 1;
}
if (c - e == f - d && (a - e != f - b || (a - c) * (a - e) > 0)) {
return 1;
}
return 2;
}
};
func minMovesToCaptureTheQueen(a int, b int, c int, d int, e int, f int) int {
if a == e && (c != a || (d-b)*(d-f) > 0) {
return 1
}
if b == f && (d != b || (c-a)*(c-e) > 0) {
return 1
}
if c-e == d-f && (a-e != b-f || (a-c)*(a-e) > 0) {
return 1
}
if c-e == f-d && (a-e != f-b || (a-c)*(a-e) > 0) {
return 1
}
return 2
}
function minMovesToCaptureTheQueen(
a: number,
b: number,
c: number,
d: number,
e: number,
f: number,
): number {
if (a === e && (c !== a || (d - b) * (d - f) > 0)) {
return 1;
}
if (b === f && (d !== b || (c - a) * (c - e) > 0)) {
return 1;
}
if (c - e === d - f && (a - e !== b - f || (a - c) * (a - e) > 0)) {
return 1;
}
if (c - e === f - d && (a - e !== f - b || (a - c) * (a - e) > 0)) {
return 1;
}
return 2;
}
impl Solution {
pub fn min_moves_to_capture_the_queen(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) -> i32 {
if a == e && (c != a || (d - b) * (d - f) > 0) {
return 1;
}
if b == f && (d != b || (c - a) * (c - e) > 0) {
return 1;
}
if c - e == d - f && (a - e != b - f || (a - c) * (a - e) > 0) {
return 1;
}
if c - e == f - d && (a - e != f - b || (a - c) * (a - e) > 0) {
return 1;
}
return 2;
}
}
class Solution {
func minMovesToCaptureTheQueen(a: Int64, b: Int64, c: Int64, d: Int64, e: Int64, f: Int64): Int64 {
if (a == e && (c != a || (d - b) * (d - f) > 0)) {
return 1
}
if (b == f && (d != b || (c - a) * (c - e) > 0)) {
return 1
}
if (c - e == d - f && (a - e != b - f || (a - c) * (a - e) > 0)) {
return 1
}
if (c - e == f - d && (a - e != f - b || (a - c) * (a - e) > 0)) {
return 1
}
2
}
}