CF1201E2 Knightmare (hard)
题目描述
这是一个交互题。
Alice 和 Bob 在一个 $n \times m$ 的国际象棋棋盘上玩游戏,其中 $n$ 和 $m$ 都是偶数。棋盘的行编号为 $1$ 到 $n$,列编号为 $1$ 到 $m$。棋盘上有两个马,一个白马最初在位置 $(x_1, y_1)$,一个黑马最初在位置 $(x_2, y_2)$。Alice 将选择其中一个马来操作,Bob 则操作另一个马。
Alice 和 Bob 轮流行动,控制白马的玩家先手。在每一回合,玩家必须按照国际象棋规则移动自己的马。也就是说,如果马当前在 $(x, y)$,它可以移动到以下任意位置(前提是仍在棋盘内):
$$(x+1, y+2),\ (x+1, y-2),\ (x-1, y+2),\ (x-1, y-2),\ (x+2, y+1),\ (x+2, y-1),\ (x-2, y+1),\ (x-2, y-1)$$
众所周知,马在棋盘中央最强。每个马都有一个唯一想要到达的位置:
- 白马的拥有者获胜的条件是:吃掉黑马,或者白马到达 $(n/2, m/2)$,且此时该位置没有被黑马攻击;
- 黑马的拥有者获胜的条件是:吃掉白马,或者黑马到达 $(n/2+1, m/2)$,且此时该位置没有被白马攻击。
形式化地说,吃掉对方的马即获胜。若某一方的马到达自己的目标格子(白马为 $(n/2, m/2)$,黑马为 $(n/2+1, m/2)$),且该位置没有被对方马攻击,也算获胜。
如果一个马可以一步走到某个位置,则称该位置被该马攻击。吃掉对方马指的是将自己的马移动到对方马所在的格子。
如果 Alice 已经走了 $350$ 步,仍无人获胜,则判为平局。
Alice 对自己的棋艺没有信心,于是请求你帮她选择一个马,并为她赢下比赛。可以证明,Alice 总有必胜策略。
输入格式
交互开始时,输入两个整数 $n$ 和 $m$($6 \le n, m \le 1000$,且 $n$ 和 $m$ 都是偶数),表示棋盘的尺寸。
第二行输入四个整数 $x_1, y_1, x_2, y_2$($1 \le x_1, x_2 \le n$,$1 \le y_1, y_2 \le m$),分别表示白马和黑马的位置。保证两个马的初始位置不同,且都不在自己的目标格子上(但可能在对方的目标格子上)。
你的程序应首先输出 "WHITE" 或 "BLACK",表示你选择操作哪一个马。如果你选择白马,则你先手。
每当轮到你行动时,你需要输出两个整数 $x$ 和 $y$,表示你要将马移动到的位置。如果你在本回合获胜,程序必须立即终止。
每当对手行动后,你会收到两个整数 $x$ 和 $y$,表示 Bob 移动马后的新位置。
如果你上一次移动不合法,或者在评测机行动后你已经输了,或者你已经走了 $350$ 步但还未获胜,你将收到 "-1 -1"。此时应立即终止程序,否则会被判为 Wrong Answer。
每次输出后,别忘了换行并刷新输出缓冲区,否则可能会被判为 Idleness limit exceeded。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其他语言请查阅相关文档。
本题不支持 Hack。
评测程序是自适应的:它的行动可能会根据你的程序的行动而变化。
输出格式
(见上文,交互式输出,无需额外说明。)
说明/提示
在第一个样例中,白马可以一步到达自己的目标格子。
在第二个样例中,无论白马如何移动,黑马都能获胜。
由 ChatGPT 4.1 翻译