#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°交叉排布时,通过错行放置障碍物让快的人慢下来。

但必须注意以下限制:

  • 障碍物不能放在终点
  • 不能放置障碍物后导致退回至无效状态
  • 障碍物放置应只影响快的人,而不影响慢的人
  • 如果一个人起始点在终点,另一个人不在,则一样无解。