目录
题面
题目背景
徐老师很胖,长宽高比例为1:1:1,他每次走路都要滚来滚去~~现在假设在一个平面上有 n 个没有公共点公共点的圆。徐老师要从点(x1,y1)走到(x2,y2)。问你最少要经过多少圆 的边界。保证这两个点都不在圆的边界上。
输入格式
第一行一个整数 n,1<=n<=50。
接下来三行每行 n 个整数,分别表示 n 个圆的圆心和半径,格式如下:
x1,x2...xi...xn
y1,y2...yi...yn
r1,r2...ri...rn
-1000<=xi,yi<=1000,1<=ri<=1000
最后一行四个整数X1,Y1,X2,Y2,-1000<=x1,y1,x2,y2<=1000。
输出格式
一个整数,意义如上。
思路
找出起点和终点是否有多少个圆包起来。
要注意:
的情况
code
#include<bits/stdc++.h>
using namespace std;
int n, x_1, x_2, y_1, y_2, ans;
int x[55];
int y[55];
int r[55];
int ju(int xo, int yo, int xt, int yt) {//距离公式
return sqrt((xo - xt) * (xo - xt) + (yo - yt) * (yo - yt));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> x[i];
for (int i = 1; i <= n; i++) cin >> y[i];
for (int i = 1; i <= n; i++) cin >> r[i];
cin >> x_1 >> y_1 >> x_2 >> y_2;
for(int i =1;i<=n;i++){
int s1 = ju(x_1,y_1,x[i],y[i]);
int s2 = ju(x_2,y_2,x[i],y[i]);
if(s1 < r[i] && s2 < r[i]);//排除一起包起来的情况
else if(s1 < r[i] or s2 < r[i]) ans++;
}
cout << ans << endl;
return 0;
}