Playing with Superglue题解

· · 题解

原题传送门
这道题我们可以用模拟的方式来找规律。
我们可以得到——
若棋子曼哈顿距离分别为 d1 和 d2 ,如果

d1>=3&&d2>=4||(d1>4||d2>4)

那么输出“ \texttt{Second} ”,否则输出“ \texttt{First} ”。

为什么呢?
可以这样理解,先手和后手的目标是使两点重合。如果横向或纵向的距离差不足 3,则两点有可能在下一步就重合了,此时先手无法继续操作,后手获胜。

如果横向和纵向的距离差至少为 3,并且至少有一方的距离差超过 4,那么显然先手可以进行一些特定的操作,例如在距离较短的那个方向上来回移动,或者向中心点移动,从而使得后手无论如何都无法阻止两点的重合,这样先手就获得了胜利。

当横向和纵向的距离差都大于 4 时,先手更容易控制两点的相对位置,这可以看作是一个更加优势的局面。即使后手想要阻止两点的重合,先手也有足够的操作空间来反击,最终取得胜利。

因此,需要满足上述条件才能让先手获胜。如果不满足这些条件,后手有可能利用先手某些操作的局限性,最终获得胜利。

知道了规律,我们就能轻松地做对这道题了,时间复杂度为 O(1)。
代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,x1,x2,y1,y2,d1,d2;
int main()
{
    scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2);
    d1=abs(x1-x2);
    d2=abs(y1-y2);
    if(d2<d1) swap(d1,d2);
    if(d1>=3&&d2>=4||(d1>4||d2>4))
        printf("Second\n");
    else printf("First\n");
    return 0;
}
/*
if(d1>=3&&d2>=4||(d1>4||d2>4))
    printf("Second\n");
else printf("First\n");
可以改成:
printf("%s\n",d1>=3&&d2>=4||(d1>4||d2>4)?"Second":"First");
*/