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;
}