你的无人机公司正计划通过一款名为“银行与俯仰控制器”(Bank And Pitch Controller)的惊人新软件在竞争中脱颖而出。该软件将确保无人机始终保持水平,这是高端无人机的必备功能。为此,它需要测量无人机的横滚角(bank)和俯仰角(pitch)。由于无人机已经配备了前置摄像头,我们将利用它来测量这些数值。
给定来自该摄像头的单帧图像,软件会运行一个高度先进的机器学习模型,以确定帧中的每个像素是属于天空、海洋,还是正好位于地平线上。该机器学习模型运行速度较慢,在下一帧视频到来之前只能处理 900 个像素。为了足够快地稳定无人机,你需要创建一个高效的算法,通过查询最多 900 个像素来找到地平线。利用这些信息,BAPC 的其余部分将能够计算出横滚角和俯仰角。
图 D.1:样例 1 的可视化,显示了查询的像素,其中两个位于地平线上的像素以白色标记。
已知地平线可以建模为一条精确的直线,并且图像中至少有两个像素会被归类为地平线。此外,无人机通常处于大致水平的飞行状态,因此你可以假设图片的最顶行始终是天空,而图片的最底行仅包含海洋像素。
第一个样例的可视化如图 D.1 所示。
交互
这是一个交互式问题。你的提交程序将针对一个交互器运行,该交互器读取你程序的标准输出并向你的程序写入标准输入。此交互需要遵循特定的协议:
交互器首先发送一行,包含两个整数 $w$ 和 $h$ ($3 \le w, h \le 1000$),分别代表图像的宽度和高度。
然后,你的程序应进行最多 900 次查询以确定地平线。每次查询通过打印一行格式为 “? x y” ($1 \le x \le w, 1 \le y \le h$) 的内容来完成,其中 $x$ 是从左侧开始计数的像素列,$y$ 是从底部开始计数的像素行。对于每次查询,交互器将打印以下内容之一:“sky”(天空)、“sea”(海洋)或“horizon”(地平线),分别表示该像素位于地平线上方、下方或正好在地平线上。
当你确定了地平线后,打印一行格式为 “! x1 y1 x2 y2” ($1 \le x_1, x_2 \le w, 1 \le y_1, y_2 \le h$) 的内容,包含一个感叹号,后跟地平线上两个不同像素的坐标。这一行不计入你的查询次数。在此之后,你的提交程序应退出,且不再读取任何输入。
如果有多个有效的解决方案,你可以输出其中任意一个。
请确保在每次写入后刷新缓冲区。
我们提供了一个测试工具来帮助你开发解决方案。
样例
样例交互 1
5 5 ? 2 4 sky ? 4 3 sea ? 5 4 horizon ? 2 3 sky ? 3 3 horizon ! 5 4 3 3
样例交互 2
1000 1000 ? 999 999 horizon ? 2 3 horizon ! 2 3 999 999