1. 题目来源
链接:P1652 圆
2. 题目说明

3. 题目解析
题目要求圆不相交,则位置关系仅有 内含、外离 两种情况。
可以针对每一个圆对于两点的位置关系局部进行考虑:
若两点都在这个圆内,则不需要跨边界。
若两点都在这个圆外,也不需要跨边界。
则唯一需要跨边界的是 一点在这个圆内,另一点在这个圆外。
整体进行考虑的时候会比较懵…不要想得太复杂…
注意:不要把 y1、next 作为全局变量进行使用,会与 C++ 函数库中的函数名、变量名啥的重复,爆一堆莫名其妙的错误…不要用为好,没必要深究。
参见代码如下:
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 55;
int n, xx, yy, x2, y2;
int ax[MAXN], ay[MAXN], ar[MAXN];
double dis(int a, int b, int c, int d) {
return sqrt((a - c) * (a - c) + (b - d) * (b - d));
}
int main() {
int res = 0;
cin >> n;
for (int i = 0 ; i < n; ++i) cin >> ax[i];
for (int i = 0 ; i < n; ++i) cin >> ay[i];
for (int i = 0 ; i < n; ++i) cin >> ar[i];
cin >> xx >> yy >> x2 >> y2;
for (int i = 0; i < n; ++i)
if (((dis(ax[i], ay[i], xx, yy) < ar[i]) && (dis(ax[i], ay[i], x2, y2) > ar[i])) ||
((dis(ax[i], ay[i], xx, yy) > ar[i]) && (dis(ax[i], ay[i], x2, y2) < ar[i])))
++ res;
cout << res << endl;
return 0;
}
该文章介绍了一个编程题目,涉及判断多个圆与两点间的位置关系,以确定是否需要跨边界。主要逻辑在于检查每个圆是否包含一点而外离另一点,累计满足条件的圆数。提供的代码实现了该算法,用于计算需要跨边界的圆的数量。

1360

被折叠的 条评论
为什么被折叠?



