这是一道交互题,仅支持 C++。
严禁试图使用 hack 交互库等方式通过该题。
题目背景
“将军棋” 是一款风靡全球的游戏。
这道题是一个简化版的问题,规则会稍有区别,但差别不大,如果您不了解规则,可以前往 generals.io 学习。
NIT 是一个 generals 高手,它研发了 4 款 generals 的人工智能,它声称它的战术是最强的。
而你,bot,需要打败他。
题目描述
游戏在一个 5×6 的棋盘上进行,您的将军位于 (1,1),NIT 的将军位于 (5,6),初始每人的将军上没有士兵。
定义一回合为如下过程:
1. 两人的将军位置上的兵力增加 1。
2. 您选择跳过您的回合,或者进行一次移动。
3. NIT 选择跳过它的回合,或者进行一次移动。
4. 若当前回合数 mod,则所有被占领的格子兵力增加 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 表示步数上限。