2017广东工业大学程序设计竞赛决赛-占点游戏

    xiaoxiao2021-03-25  11

    占点游戏

    Description

    众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:“我要跟你决一死战!”然后Maple就跟TMK玩起了一个关于占点的游戏。

    Maple在一个无限展开的只有整数点的二维平面上找到两个点,由TMKMaple分别操控这两个点,两人轮流操作,每一次操作中TMKMaple可以把他的点移动一格到上、下、左、右四个方向,当TMK操作时,移动到的这个点会被染成红色,而当Maple操作时,移动到的这个点会被染成蓝色,需要注意的是,两个起始时的两个点也都会被染上相应的颜色,而当任一人走到已经染了不同颜色的点,这个颜色会被覆盖掉,当两个点覆盖在一起时,这个点会被后来的点染色。当游戏结束时染着自己颜色的点就代表被自己占领了。

    TMK一下就明白了,这个游戏的目标是让自己占领的点比对方占领的点多,而且要让差值最大。

    为了公平一些,Maple决定让TMK来选择先手或后手和让TMK来选择点,相应的Maple就会选择另一个点。

    现在给出游戏的总轮数NMaple选择的两个点的坐标(x1y1),(x2y2),要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

    41 0 0 1 02 0 0 1 01 0 0 2 02 0 0 2 0

    Sample Output

    2-11-1

    HINT

    解题思路:令 d = abs(x1-x2)+abs(y1-y2) 首先判断(n+1)/2 >= d,先手可不可以从一个点走到另一个点 : 如果不可以,则先手可以多得 n&1 分(因为劣势者可以选择逃离) 如果可以,考虑 d 的奇偶性: 如果 d 为奇数(先手可以先踩到后手覆盖过的点):如果 n 为奇数,先手可以多得 2 分,否则平。 否则(d 为偶数):如果 n 为奇数,先手可以多得 1 分,否则后手可以多得 1 分

    #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <functional> #include <climits> using namespace std; #define LL long long const int INF=0x3f3f3f3f; int main() { int n,x1,x2,y1,y2; int t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d%d",&n,&x1,&y1,&x2,&y2); int d=abs(x1-x2)+abs(y1-y2); int ans=-1; if((n+1)/2>=d) { if(d%2!=0) { if(n%2!=0) ans=2; } else ans=1; } else if(n%2!=0) ans=1; printf("%d\n",ans); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-200156.html

    最新回复(0)