基础计算几何

本文介绍了如何在二维有界网格中,通过询问特定角落点的距离,确定未知点的直线并交叉点,解决一个基于问答形式的编程题目。特别强调了输出时缓冲区刷新的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Code force round931 C

基本思路

确定一个点位置,在这道题中主要是采用了问答的形式,主要思想还是,在二维有界网格中,已知一个未知点距离一个角落点的距离,可以确定这个未知点所在的一条直线,同理,只需要询问两个角落点,即可通过两个直线的交叉点确定,这道题即是这个推论的拓展应用。

本题注意点

cout输出后如果要刷新缓冲区,应该使用endl或者cout.flush(),不能使用fflush(stdout)
而printf输出后如果要刷新缓冲区,应该使用fflush(stdout);

本题具体想法

询问(1,1),(1,m),(n,1)三个点,得到三个值,确定三条直线,两个可疑交点,然后询问其中一个可疑交点,得出结果。

#include "bits/stdc++.h"


using namespace std;
using ll = long long;
#define For for(int i=1;i<=n;i++)
#define rFor for(int i=n;i>0;i--)
#define Whole(x) for(auto item:x)
const int N = 2e5;
int row, col;
int query(int x, int y) {
	::printf("? %d %d\n", x, y);
	fflush(stdout);
	int res;
	cin >> res;
	return res;
}
void output(int x, int y) {
	::printf("! %d %d\n", x, y);
	fflush(stdout);
}
void inline solve() {
	cin >> row >> col;
	int a = query(1, 1);
	if (!a) {
		output(1, 1);
		return;
	}
	int b = query(1, col);
	if (!b) {
		output(1, col);
		return;
	}
	int d = query(row, col);
	if (!d) {
		output(row, col);
		return;
	}
	double x1 = (a + 3 - col + b) / 2.0, y1 = (a + 1 + col - b) / 2.0, x2 = (row + 1 + b - d) / 2.0, y2 = col + (row - 1 - b - d) / 2.0;
	int ans = -1;
	if (x1 == (int)x1 && y1 == (int)y1 && x1 >= 1 && y1 >= 1 && x1 <= row && y1 <= col) {
		ans = query(x1, y1);
	}
	if (ans) {
		output(x2, y2);
	} else output(x1, y1);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int num = 1;
	cin >> num;
	while (num--) {
		solve();
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值