以下是一种简化并优化的代码实现,可以更好地判断马是否可以走到某个位置:
#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"。
希望这个代码实现能满足你的需求,如果有任何问题,请随时提问! |