Logo Infinity Online Judge

InfOJ

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

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