【2016.10.7NOIP普及模拟】圆的国度

lzusa 发布于 2019-04-13 1032 次阅读


题目描述

平面上有n个没有公共点的圆。你要从点(X1,Y1)走到(X2,Y2)。问你最少要经过多少圆的边界。保证这两个点都不在圆的边界上。

输入

第一行一个整数n。
接下来三行,每行n个整数,之间有1个空格分开,分别表示n个圆的圆心坐标xi、yi和半径r,格式如下:
x1,x2,„,xi,„,xn
y1,y2,„,yi,„,yn
r1,r2,„,ri,„,rn
最后一行四个整数X1,Y1,X2,Y2,之间有1个空格分开,表示起点(X1,Y1)和终点(X2,Y2)。

输出

输出一行一个整数,意义如上。

#include <stdio.h>
#include <string>
#include <cmath>
using namespace std;
int a[100],b[100],c[100];
int xx1,xx2,yy1,yy2,n,i,ans;
bool x,y;
int main()
{
    freopen("circle.in", "r", stdin);
    freopen("circle.out", "w", stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for (int i=1;i<=n;i++)
        scanf("%d",&b[i]);
    for (int i=1;i<=n;i++)
        scanf("%d",&c[i]);
    scanf("%d%d%d%d",&xx1,&yy1,&xx2,&yy2);
    for (int i=1;i<=n;i++)
    {
        x=0; y=0;
        if (sqrt((xx1-a[i])*(xx1-a[i])+(yy1-b[i])*(yy1-b[i]))<c[i]) x=1;
        if (sqrt((xx2-a[i])*(xx2-a[i])+(yy2-b[i])*(yy2-b[i]))<c[i]) y=1;
        if (!x&&y||!y&&x) ans++;
    }
    printf("%d\n",ans);

}