## 题目描述在中国象棋中马走日字形。用 $ij$ 表示第 $i$ 行第 $j$ 列的格点不考虑别马腿和跳出棋盘外在 $ij$ 的马可以跳到 $i-2j+1$$i-2j-1$$i-1j+2$$i-1j-2$$i+1j+2$$i+1j-2$$i+2j+1$$i+2j-1$ 八个位置。本题将解决将军抽车的简化版问题。在本题中将军抽车就是要通过一步跳马在能够将军的同时将车置于马的攻击位置。只考虑棋盘上有
解题思路
我们可以穷举马的8个可能的位置,判断每个位置是否可以将军抽车。
具体地,对于马的每个可能位置 $(i,j)$,我们需要满足以下两个条件:
- 车和帅在同一行或同一列:$S_x = C_x$ 或 $S_y = C_y$;
- 目标位置 $(i,j)$ 在车的攻击范围内:$(i,j)$ 和车的位置 $(C_x,C_y)$ 在同一行或同一列。
如果以上两个条件都满足,则返回结果 Yes,否则返回结果 No。
复杂度分析
马的8个可能位置都需要进行判断,因此时间复杂度为 $O(1)$。
参考代码
#include <iostream>
using namespace std;
int main() {
int Sx, Sy, Cx, Cy, Mx, My;
cin >> Sx >> Sy >> Cx >> Cy >> Mx >> My;
bool canCapture = false;
// check each possible position of the horse
for (int dx = -2; dx <= 2; dx++) {
for (int dy = -2; dy <= 2; dy++) {
if (dx * dx + dy * dy == 5) { // horse's move
int x = Mx + dx;
int y = My + dy;
// check if the position is valid and the horse can capture the car
if (x >= 1 && x <= 10 && y >= 1 && y <= 9 && (Sx == Cx || Sy == Cy) && (x == Cx || y == Cy)) {
canCapture = true;
break;
}
}
}
}
if (canCapture) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/iA56 著作权归作者所有。请勿转载和采集!