Logo Infinity Online Judge

InfOJ

时间限制:1 s 空间限制:256 MB

#131. Intelligence

统计

这是一道交互题,仅支持 C++。

严禁试图使用 hack 交互库等方式通过该题。

题目背景

“将军棋” 是一款风靡全球的游戏。

这道题是一个简化版的问题,规则会稍有区别,但差别不大,如果您不了解规则,可以前往 generals.io 学习。

NIT 是一个 generals 高手,它研发了 $4$ 款 generals 的人工智能,它声称它的战术是最强的。

而你,bot,需要打败他。

题目描述

游戏在一个 $5\times 6$ 的棋盘上进行,您的将军位于 $(1,1)$,NIT 的将军位于 $(5,6)$,初始每人的将军上没有士兵。

定义一回合为如下过程:

$1.$ 两人的将军位置上的兵力增加 $1$。

$2.$ 您选择跳过您的回合,或者进行一次移动。

$3.$ NIT 选择跳过它的回合,或者进行一次移动。

$4.$ 若当前回合数 $\bmod 25= 0$,则所有被占领的格子兵力增加 $1$。

下面是对具体规则的描述:

我们定义一次移动如下:

选择一个位置,使得该位置包含的己方兵力 $>1$,若该位置的己方兵力为 $X$ 则将其中的 $X-1$ 个兵移到相邻的一个位置,保留一个兵在原位。

若在任意一时刻存在一个位置同时有两方的兵力,假设分别为 $X,Y$,那么两方的兵力都会减去 $\min(X,Y)$。

定义一个位置是被占领的,当且仅当其兵力 $>0$。

若在任意一个时刻某方将军的位置被对方占领,游戏结束,占领者获胜。

若任何一方操作不合法,另一方获胜。

若回合数超过给定限制,NIT 获胜。

NIT 的战术:

战术 $1$:NIT 只会跳过它的回合。

战术 $2$:每当 NIT 将军处的人数 $>10$ 时,NIT 会将当前将军处的所有人沿着 $(5,6)\rightarrow (5,1)\rightarrow (1,1)$ 的路线移动,直到人数 $\leq 1$。

战术 $3$:在游戏开始前,NIT 会选择一个 $[5,15]$ 的随机数 $k$,若 NIT 将军处的人数 $>k$,NIT 会将所有人沿着一条随机路线移动,向 $(1,1)$ 移动,直到人数 $\leq 1$,然后重新在 $[5,15]$ 之间选择一个 $k$。

战术 $4$:NIT 会学习您的操作,若您选择跳过,NIT 也会选择跳过,若您选择移动,NIT 会在进行一次与您的移动关于 $(3,3.5)$ 中心对称的一次移动。

实现细节

请在代码中 #include"intelligence.h"

您需要实现两个函数。

void Start(int o)

交互库会调用这个函数恰好一次,其中 $o$ 代表 NIT 的战术编号。

void move(int posx,int posy,int newposx,int newposy,int &Posx,int &Posy,int &NewPosx,int &NewPosy)

每次移动时交互库会调用这个函数,前四个参数表示 NIT 的移动,后四个参数表示您的移动。

若 $posx=posy=newposx=newposy=0$,表示 NIT 跳过了它的回合。

若您想跳过您的回合,请令 $Posx=Posy=NewPosx=NewPosy=0$。

保证第一次调用此函数时 $posx=posy=newposx=newposy=0$。

测试方式

在上方的 自定义测试 中可以测试你的代码。

输入格式:第一行一个整数 $o\in [1,4]$,第二行一个正整数为步数上限。

如果输出为 114514 说明程序是正确的,否则说明程序是错误的。

子任务

$Subtask1(25pts):o=1,X=114$

$Subtask2(25pts):o=2,X=114$

$Subtask3(25pts):o=3,X=114$

$Subtask4(25pts):o=4,X=14$

$X$ 表示步数上限。