Logo Universal Online Judge

UOJ

时间限制:2 s 空间限制:512 MB
统计

Sample

题目描述

交互题。

你在探索末地的一个新结构——末地飞船遗迹,但是不幸的是,你的显示屏坏了。你只能通过 听声音来判断自己的处境了。

遗迹的结构可以看做一个 $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 格。