感觉交互题就是不断地去缩小答案范围,得注意观察它的询问次数,询问次数是特殊条件
题意:
给定一个棋盘,在棋盘上某个位置放置了一个棋子,你可以问不超过3个问题,每次问题query(x,y)都会回答从(x,y)出发到目标点最少要走的距离,试确定目标点的位置
思路:
构造题,选定一个特殊的点进行提问
选定(1,1),得到目标点离(1,1)的距离
这样目标点的范围就缩小到如下位置:
然后对(1,k+1),(k+1,1)提问,可以进一步缩小答案范围
对(1,k+1)询问,如果离(1,1)的距离小于(1,k+1)的距离,那么就在最底下那根线上
否则就在右边的线上
Code:
#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int mxn=1e5+10;
const int Inf=0x3f3f3f3f;
int n,m;
int query(int x,int y){
if(x>n||y>m) return Inf;
int ans;
cout<<"?"<<" "<<x<<" "<<y<<'\n';
cin>>ans;
return ans;
}
void output(int x,int y){
cout<<"!"<<" "<<x<<" "<<y<<'\n';
}
void solve(){
cin>>n>>m;
int x=query(1,1);
int y=query(1,x+1);
int z=query(x+1,1);
if(y<x) output(y+1,x+1);
else output(x+1,z+1);
}
signed main(){
//cout.flush();
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}