Problem B: 占点游戏
Description
众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:“我要跟你决一死战!”然后Maple就跟TMK玩起了一个关于占点的游戏。
Maple在一个无限展开的只有整数点的二维平面上找到两个点,由TMK和Maple分别操控这两个点,两人轮流操作,每一次操作中TMK或Maple可以把他的点移动一格到上、下、左、右四个方向,当TMK操作时,移动到的这个点会被染成红色,而当Maple操作时,移动到的这个点会被染成蓝色,需要注意的是,两个起始时的两个点也都会被染上相应的颜色,而当任一人走到已经染了不同颜色的点,这个颜色会被覆盖掉,当两个点覆盖在一起时,这个点会被后来的点染色。当游戏结束时染着自己颜色的点就代表被自己占领了。
TMK一下就明白了,这个游戏的目标是让自己占领的点比对方占领的点多,而且要让差值最大。
为了公平一些,Maple决定让TMK来选择先手或后手和让TMK来选择点,相应的Maple就会选择另一个点。
现在给出游戏的总轮数N,Maple选择的两个点的坐标(x1,y1),(x2,y2),要TMK来选择先后手和起始点,假设Maple一定按最优策略来走,问TMK能不能选择先后手和起始点使得自己占领的点比Maple占领的多,如果能,那么同时要求出占领的点数的最大差值。
Input
第一行一个T,代表接下来有T组数据(1<=T<=2000)。
每组数据有五个整数N,x1,y1,x2,y2,代表了操作的总轮数N以及选择的两个起始点(x1,y1),(x2,y2),其中1<=N<=10^8,-10^8<=x1,y1,x2,y2<=10^8,数据保证两个点不相同。
Output
对于每一组数据,如果TMK占领的点不能比Maple占领的多,那么输出-1,否则输出两个占领点数的最大差值。
Sample Input
4
1 0 0 1 0
2 0 0 1 0
1 0 0 2 0
2 0 0 2 0
Sample Output
2
-1
1
-1
设d=2点间距离
当n%2==0
若n/2<d,只要对手一直跑路,TMK不可能吃到对方的点,双方打平,ans=−1
若n/2>=d且d%2==1,此时,后手只要一直模仿先手,下的子与先手全部对称,双方打平,ans=−1
若n/2>=d且d%2==0,此时,如果先手不跑路,后手一直跟先手对称下,必然吃多先手一只格子,如果先手跑路,后手一只追,至少可以吃到先手的一个格子,ans=1
当n%2==1
若(n+1)/2<d,后手跑路,先手多一个格子(步数多1步),不跑路(先手能吃更多),ans=1
若(n+1)/2>=d且d%2==1,后手跑路,先手一直跟着,吃多1只,比后手多2个格子,后手不跑路,先手对称下,比后手多吃一只,也是多2个格子,ans=2
若(n+1)/2>=d且d%2==0,后手跑路,先手一直追,最多吃1格,后手不跑路,对称下,吃一只,ans=1
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include <string.h>
#include<math.h>
#include<list>
#define pii pair<int,int>
using namespace std;
#define ll long long
const int inf=1e9+7;
const int INF=inf;
const double EPS=1e-8;
const int N = 2e3 + 5;
int main()
{
//freopen("/home/lu/Documents/r.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
int n,x1,y1,x2,y2;
scanf("%d%d%d%d%d",&n,&x1,&y1,&x2,&y2);
int d=abs(x1-x2)+abs(y1-y2);
if(n%2==0){
if(n/2>d&&d%2==0){
puts("1");
}
else{
puts("-1");
}
}
else{
if(n/2+1>=d){
puts(d%2==1?"2":"1");
}
else{
puts("1");
}
}
}
return 0;
}