live archive 5984 - Save the Students!

题意:给出多个三角形,圆,正方形,问他们覆盖的点的个数。点的横纵坐标都是整数

思路:从-50到100.枚举每一个点。看是否被覆盖:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>

using namespace std;
const double PI = acos(-1.0);
const double INF = 1e20 , EPS = 1E-6;
bool zero(double x){
    return -EPS<x&&x<EPS;
}
///向量
struct cvector{
    double x,y;
    cvector() {}
    cvector(double x,double y){
        this->x=x,this->y=y;
    }
};
cvector operator +(cvector p,cvector q){
    return cvector(p.x+q.x,p.y+q.y);
}
cvector operator -(cvector p,cvector q){
    return cvector(p.x-q.x,p.y-q.y);
}
cvector operator *(double k,cvector p){
    return cvector(k*p.x,k*p.y);
}
double operator *(cvector p,cvector q){
    return p.x*q.x+p.y*q.y;
}
double operator^(cvector p,cvector q){   ///叉积
    return p.x*q.y-q.x*p.y;
}
double length(cvector p){   ///向量的模
    return sqrt(p*p);
}
cvector unit(cvector p){ ///单位化
    return 1/length(p)*p;
}
double project(cvector p,cvector n){  ///p在n上投影(可负)
    return p*unit(n);
}
///点线
struct cpoint{
    double x,y;
    cpoint(){}
    cpoint(double x,double y){
        this->x = x;this->y =y;
    }
};
struct cline{
    cpoint a,b;
    cline(){}
    cline(cpoint a,cpoint b){
        this->a=a;this->b=b;
    }
};
cvector operator -(cpoint a, cpoint b){   ///向量ab
    return cvector(b.x-a.x, b.y-a.y);
}
cpoint operator +(cpoint a, cvector p){    ///点a 沿向量p移动
    return cpoint(a.x+p.x,a.y+p.y);
}
double dist(cpoint p, cpoint q){   ///两点间距离
    return length(p-q);
}
double dist(cpoint p, cline l){    ///点与线的距离
    return fabs((p-l.a)^(l.b-l.a))/length(l.b-l.a);
}
bool parallel(cline u,cline v){    ///线线平行或共线
    return zero((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y));
}
bool perpendicular(cline u,cline v){   ///线线垂直
    return zero((u.b-u.a)^(v.b-v.a)) ;
}
bool dots_inline(cpoint p1,cpoint p2,cpoint p3){///判三点共线
return zero((p2-p1)^(p3-p1));
}
cline parrllel(cpoint p, cline l){   ///过p点 作l平行线
    return cline(p, p+(l.b-l.a));
}
cpoint rotate(cpoint b, cpoint a,double alpha){   ///a绕b旋转alpha角(弧度)
    cvector p=b-a;
    return cpoint(a.x+(p.x*cos(alpha)-p.y*sin(alpha)),
                  a.y+(p.x*sin(alpha)+p.y*cos(alpha)));
}
cpoint foot(cpoint p, cline l){     ///过p点 作l垂足
    return l.a+project(p-l.a,l.b-l.a)*unit(l.b-l.a);
}
cline vertical(cpoint p, cline l){   ///过p点 作l垂线
    return cline(p,p+(rotate(l.b,l.a,PI/2)-l.a));
}
cpoint intersection(cline u,cline v){   ///线与线的交点
    cpoint ret = u.a;
    double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))
    /((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
    ret.x+=(u.b.x-u.a.x)*t;
    ret.y+=(u.b.y-u.a.y)*t;
    return ret;
}
bool dot_onseg(cpoint p,cline ll){    /// 点在线段上
   if(!dots_inline(p,ll.a,ll.b)) return false;
    cvector v1=ll.b-ll.a,v2=p-ll.a;
    cvector v3=ll.a-ll.b,v4=p-ll.b;
    if(v1*v2>-EPS&&v3*v4>-EPS) return true;
    return false;
}
bool same_side(cpoint p1,cpoint p2,cline l){  ///两点在线段同侧
    cvector v0=l.b-l.a;
    cvector v1=p1-l.a,v2=p2-l.a;
    return (v1^v0)*(v2^v0)>EPS;
}
bool opposite_side(cpoint p1,cpoint p2,cline l){  ///两点在线段异侧
    cvector v0=l.b-l.a;
    cvector v1=p1-l.a,v2=p2-l.a;
    return (v1^v0)*(v2^v0)<-EPS;
}
bool intersect_in(cline u,cline v){   ///线段相交,包括交点和重合
    if(!dots_inline(u.a,u.b,v.a)||!dots_inline(u.a,u.b,v.b))
        return !same_side(u.a,u.b,v)&&!same_side(v.a,v.b,u);
    return dot_onseg(u.a,v)||dot_onseg(u.b,v)
    ||dot_onseg(v.a,u)||dot_onseg(v.b,u);
}
bool intersect_ex(cline u,cline v){   ///线段相交,不包括交点和重合
    return opposite_side(u.a,u.b,v)&&opposite_side(v.a,v.b,u);
}
cpoint ptoseg(cpoint p,cline l){    ///点到线段的最近点
    cvector pt=l.b-l.a;
    cvector pa=l.a-p,pb=l.b-p;
    if((pt^pa)*(pt*pb)>EPS)
        return dist(p,l.a)<dist(p,l.b)?l.a:l.b;
    return foot(p,l);
}
double distptoseg(cpoint p,cline l){    ///点到线段的距离
    cvector pt=l.b-l.a;
    cvector pa=l.a-p,pb=l.b-p;
    if((pt^pa)*(pt*pb)>EPS)
        return min(dist(p,l.a),dist(p,l.b));
    return dist(p,l);
}
double length(double k)
{
    if(k<0) return -k;
    return k;
}
int n;
struct T{
    cpoint a[3];
    bool in(cpoint t)
    {
       // cout<<">> "<<length((a[2]-a[1])^(a[2]-a[0]))<<endl;
        if(length((a[1]-a[0])^(t-a[0]))+length((a[2]-a[0])^(t-a[0]))+length((a[1]-a[2])^(t-a[2]))-length((a[2]-a[1])^(a[2]-a[0]))>EPS)
        return false;
        return true;
    }
}t[59];
struct C{
    cpoint a;
    double len;
    bool in(cpoint t)
    {
        if(length(a-t)-len>EPS) return false;
        return true;
    }
} c[59];
struct S{
    cpoint a;
    double len;
    bool in(cpoint t)
    {
        if(t.x<a.x||t.x>a.x+len) return false;
        if(t.y<a.y||t.y>a.y+len) return false;
        return true;
    }
} s[59];
int ts=0,tt=0,tc=0;
bool oor(int x,int y)
{
    cpoint a = cpoint(x,y);
    for(int i=0;i<tt;i++)
    if(t[i].in(a)) return true;
    for(int i=0;i<ts;i++)
    if(s[i].in(a)) return true;
    for(int i=0;i<tc;i++)
    if(c[i].in(a)) return true;
    return false;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int cas;
    scanf("%d",&cas);
    int x1,y1,l;
    char ch[3];
    while(cas--)
    {
        int n;
        scanf("%d",&n);
        ts=0,tt=0,tc=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s",ch);
            if(ch[0]=='C')
            {
                scanf("%d%d%d",&x1,&y1,&l);
                c[tc].a=cpoint(x1,y1);
                c[tc].len = l;
                tc++;
            }
            else if(ch[0]=='S')
            {
                scanf("%d%d%d",&x1,&y1,&l);
                s[ts].a=cpoint(x1,y1);
                s[ts].len = l;
                ts++;
            }
            else if(ch[0]=='T')
            {
                for(int j =0;j<3;j++)
                {
                    scanf("%d%d",&x1,&y1);
                    t[tt].a[j] = cpoint(x1,y1);

                }tt++;
            }

        }
        int ans=0;
        for(int i=-50;i<101;i++)
        for(int j=-50;j<101;j++)
        {
            if(oor(i,j)) ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值