给一个 \(n \times m\) 的网格,里面藏了一个炸弹 \((x_0, y_0)\) 。你可以选择 \(k\) 个坐标 \((x_1, y_1), (x_2, y_2), \cdots, (x_k, y_k)\) 。第 \(i\) 次选择计算机会回复你一个数 \(d_i = |x_0 - x_i| + |y_0 - y_i|\) 。至少需要选出多少个坐标才能确定 \((x_0, y_0)\) 的位置?
观察:\(d_i\) 意味着 \((x_i, y_i)\) 半径为 \(d_i\) 的边上有炸弹。
- 当 \(n = 1, m = 1\) ,选择 \(0\) 次可以确定炸弹位置。
- 当 \(min(n,m) = 1, max(n, m) > 1\)
- 若选任意位置,圆和坐标轴至多有 \(2\) 个交点,即至多选 \(2\) 次确定。
- 若选择端点,圆和坐标轴只有 \(1\) 个交点,可以确定炸弹位置。故答案为 \(1\) 。
- 当 \(min(n,m) > 1\)
- 若选任意两个点,他们的圆最多至多存在两个交点,即至多选 \(3\) 次确定。
- 当选择的两个点在同一条网格边上,他们的圆只有一个交点,至多选 \(2\) 次确定。故答案为 \(2\) 。
view
#include <bits/stdc++.h>
void solve() {
int n, m; std::cin >> n >> m;
if (std::max(n, m) == 1) std::cout << 0 << '\n';
else if (std::min(n, m) == 1 && std::max(n, m) > 1) std::cout << 1 << '\n';
else std::cout << 2 << '\n';
}
signed main() {
int _ = 1; std::cin >> _;
while (_--) solve();
return 0;
}
- Codeforces Guessing Global Round Lightcodeforces guessing global round codeforces global round 16 codeforces global round 14 codeforces global round 15 codeforces global round codeforces avoiding global round codeforces destroys universe global codeforces pegging global doremy codeforces perfect global doremy educational codeforces round rated