题目描述
交互题。
你在探索末地的一个新结构——末地飞船遗迹,但是不幸的是,你的显示屏坏了。你只能通过 听声音来判断自己的处境了。
遗迹的结构可以看做一个 $n$ 行 $m$ 列矩形网格,网格的四周有墙壁包裹,中间是空地,没有遮 挡物。你已经知道了遗迹的大小和自己的位置。遗迹中存在一个传送门,具体而言,每当你走 到 A 格时,你就会被立即传送到 B 格。你还不知道 A 格和 B 格的具体位置。
每次你可以尝试向上下左右四个方向中的任意一个方向移动一格,如果你将要移动到的格子是 空地或传送门,那么什么也不会听到,如果你将要移动到的格子是墙,那么你会听到撞击声并 且移动失败。
请你找出 A 格和 B 格的具体位置。
交互方式
你不需要,也不应该实现主函数,你只需要实现函数 void explore(int n, int m, int x,int y, int L)
,这里的参数 $n$ 和 $m$ 表示遗迹的大小,参数 $x$ 和 $y$ 表示你当前的位置是第 $x$ 行第 $y$ 列,参数 $L$ 表示调用限制。你可以通过调用如下两个函数来和交互库进行交互:
int make_move(int dx, int dy)
:尝试进行移动,参数 $dx$ 和 $dy$ 表示要移动的方
向,且必须保证 $dx$ 的绝对值加上 $dy$ 的绝对值恰好为 。该函数返回 $0$ 表示移动成功,
返回 $1$ 表示撞墙,移动失败。该函数不能调用超过 $5\times 10^7$ 次。参数不合法或调用次数
超过限制时,会始终返回负数;
void answer(int ax, int ay, int bx, int by)
:回答传送门的位置,即 A 格在第 $ax$
行第 $ay$ 列,B 格在第 $bx$ 行第 $by$ 列。这个函数必须被最后调用,且被调用恰好一次。
约束
对于所有测试数据,保证:
$1\le n, m\le 1000$
A 格和 B 格是两个不相同的格子,机器人初始位置不是 A 格;
评测时,交互库会恰好调用 explore
一次;
本题保证所选定传送门格子在交互开始之前已经完全确定,不会根据和你的程序的交互过 程动态构造,因此题目中的交互操作都是确定性的,你不需要关心这些操作在交互库中的 具体实现;
在保证询问次数不超过 的前提下,交互库所使用的的时间不超过 $1.0$ 秒,空间 不超过 $128MiB$,也就是说你至少有 $1.0$ 秒时间和 $384MiB$ 空间可以使用。
特殊性质:
- A:保证 A、B 格和你的初始位置在同一行;
- B:保证 A、B 格均与某个墙壁有公共边;
- C:保证 A 格在 B 格的右下方;
- D:保证 A 格和 B 格不相邻,且 A、B 两格与墙壁至多有一条公共边。
评分标准
在答案正确的前提下,设该组数据的调用次数限制为 $L$,你对 make_move
函数的调用次数为
,那么
若 $k\le L$,你得该组数据 $100\%$ 的分数;
若 $L < k \le 5\times 10^7$,你得该组数据 $20\%$ 的分数;
若 $5\times 10^7 < k$,你不得分。
实现细节
下发文件已经提供了一个 sample.cpp
,你可以将这个文件拷贝一份,重命名为 ruin.cpp
,
然后在其基础上答题。
请确保你的程序开头包含:
#include "ruin.h"
试题目录下的 grader.cpp
以及 ruin.h
是我们提供的交互库参考实现,最终测试时所用的
交互库实现与该参考实现有所不同,因此选手的解法不应该依赖交互库实现。
你需要在本题目录下使用如下命令编译得到可执行程序:
g++ grader.cpp ruin.cpp -o ruin -O2 -std=c++14
对于编译得到的可执行程序,可执行文件将从标准输入读入以下格式的数据:
第一行九个整数 $n, m, x, y, ax, ay, bx, by, L$ 表示遗迹的大小、你的初始位置、传送门的位
置和调用次数限制。读入完成之后,交互库将调用恰好一次函数 explore
,用输入的数据测
试你的函数。你的函数正确返回后,交互库会判断你的计算是否正确,若正确则会输出 OK
.
和交互函数调用次数相关信息,否则会输出相应的错误信息。
提示
题目描述中所述的传送是单向的,即你并不会从 B 格传送到 A 格。