#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ll n; cin >> n;
//初始标记设为false,考虑true的情况。
bool label = false;
ll x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2;
if(x1 == x2 && y1 == y2) label = true;
//交叉情况
if (x1 != x2 && abs(y1 - y2) == 1){
//先设为true,后续false的特殊情况可将其覆盖。
label = true;
//只有一人初始在终点,此时不可行
if ((x1 == 2 && y1 == n) || (x2 == 2 && y2 == n)) label = false;
//此时障碍设在终点,不可行
if (x1 == 2 && y1 == n - 1 && y2 == n - 2) label = false;
if (x2 == 2 && y2 == n - 1 && y1 == n - 2) label = false;
}
cout << (label ? "YES" : "NO");
}
问题分析
1. 基本原则
如果两个人到终点的曼哈顿距离相等,则无需放置障碍物。
如果两人到终点的曼哈顿距离不等,则需要考虑障碍物的放置策略。
2. 无效放置方案
以下情况无法通过放置障碍物使两人距离相等:
情况A:障碍物在同一行
障碍物在同一行会同时影响两个人的路径。
初始状态
o x o x o o
o o o o o o
放置障碍后
o x o x * o
o o o o o o
这种放置方式会影响两个人,无法达到调整的目的。
情况B:让慢的人更慢
如果障碍物让原本就慢的人更慢,无法缩小差距。
示例
o x * x o o
o o o o o o
这种策略只会扩大两人的距离差距。
注意:如果障碍物在另一行且不影响两人的相对位置,则没有任何效果。
3. 有效策略:让快的人慢下来
核心思想是让距离终点更近的人(快的人)减慢速度。
有效方案1:错行交叉放置
初始状态
o o x o o o
o o o x o o
放置障碍后
o o x o o o
o o o x * o
放置障碍后,快的人需要绕行,两人下一步将重合。
有效方案2:反向交叉放置
初始状态
o o o x o o
o o x o o o
放置障碍后
o o o x * o
o o x o o o
同样可以达到使两人距离相等的效果。
4. 特殊情况与限制
退回至无效状态
初始状态
o o o x o o
o x o o o o
尝试放置障碍
o o o x * o
o x o o o o
导致无效状态
o o o o * o
o o x x o o
这种情况下会退回到同一行的无效状态,导致无解。
障碍不能放在终点
特殊情况
o o o x o o
o o o o x o
由于障碍不能放置在终点,这种情况下也无解。
结论总结
唯一可行的解决方案是:两人呈45°交叉排布时,通过错行放置障碍物让快的人慢下来。
但必须注意以下限制:
- 障碍物不能放在终点
- 不能放置障碍物后导致退回至无效状态
- 障碍物放置应只影响快的人,而不影响慢的人
- 如果一个人起始点在终点,另一个人不在,则一样无解。

京公网安备 11010502036488号