|
发表于 2023-8-11 21:32:22
|
显示全部楼层
以下是一种简化并优化的代码实现,可以更好地判断马是否可以走到某个位置:
- #include <iostream>
- #include <vector>
- using namespace std;
- bool isValidMove(int x, int y) {
- return (x >= 1 && x <= 10 && y >= 1 && y <= 9);
- }
- bool canMaMove(int Sx, int Sy, int Cx, int Cy, int Mx, int My) {
- vector<pair<int, int>> moves = {{-2, 1}, {-2, -1}, {-1, 2}, {-1, -2}, {1, 2}, {1, -2}, {2, 1}, {2, -1}};
-
- for(const auto& move : moves) {
- int nx = Mx + move.first;
- int ny = My + move.second;
-
- if(isValidMove(nx, ny)) {
- // 判断跳日的两个点是否有棋子阻挡
- if((abs(nx-Sx) == 2 && abs(ny-Sy) == 1 && !(nx == Cx && ny == Cy)) ||
- (abs(nx-Cx) == 2 && abs(ny-Cy) == 1 && !(nx == Sx && ny == Sy))) {
- return true;
- }
- }
- }
-
- return false;
- }
- int main() {
- int Sx, Sy, Cx, Cy, Mx, My;
- cin >> Sx >> Sy >> Cx >> Cy >> Mx >> My;
-
- if(canMaMove(Sx, Sy, Cx, Cy, Mx, My)) {
- cout << "Yes" << endl;
- } else {
- cout << "No" << endl;
- }
-
- return 0;
- }
复制代码
这个代码主要重构了循环的实现,使用一个储存移动偏移量的数组来遍历所有可能的移动。然后,对于每个移动,检查新位置是否在合法的范围内,并根据给定条件判断是否可以移动到该位置。
此外,我添加了一个isValidMove函数用于检查位置是否在合法的棋盘范围内。最后,通过调用canMaMove函数来判断马是否可以移动到符合条件的位置,并根据结果输出"Yes"或"No"。
希望这个代码实现能满足你的需求,如果有任何问题,请随时提问! |
|