这是一道交互题,仅支持 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$ 表示步数上限。