占点游戏

本文介绍了一个关于占点的游戏,玩家需在无限的二维平面上移动整数点,并通过策略选择使自己的点数多于对手。文章提供了实现该策略的C++代码样例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem B: 占点游戏

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

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

题解:

#include<bits/stdc++.h>
using namespace std;
void solve()
{
    int n,x1,y1,x2,y2;
    cin>>n>>x1>>y1>>x2>>y2;
    int l=abs(x1-x2)+abs(y1-y2),ans=0;
    if(n&1) //判断是否为奇数 
    {
        n=n/2+1;//先手走的次数 
        if(l>n) ans=1;//两者距离如果大于走的次数 
        else if(l&1) ans=2;//两者距离小于走的次数,且l是奇数,意味出现覆盖 
        else ans=1;
    }
    else
    {
        n=n/2;//走的次数 
        if(l>n) ans=-1;//两者距离过大,点数一样 
        else if(l&1) ans=-1;//存在覆盖 
        else ans=1;
    }
    cout<<ans<<endl;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
        solve();
    return 0;
}

tips:

1.小白学到了#include<bits/stdc++.h>,这个是C++的万能头文件。

2.题目的意思是两个人一共走了N步,考试的时候理解错误。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值