• poj 1584 A Round Peg in a Ground Hole 夜


    http://poj.org/problem?id=1584

    题意 给你个多边形和一个钉子,让你判断是否 钉子可以放里面

    注意  1 ,多边形所给的顺序 可能是逆时针也可能时顺时针

            2 ,钉子可能在多边形外面

            3 ,钉子可能在多边形上

            4 ,先给半径后给圆的坐标

    #include<iostream>
    #include<cmath>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    
    const int N=1001;
    struct node
    {
        double x,y;
    }mem[N];
    int Leftturn(double x1,double y1,double x2,double y2)//给出两个向量 求往哪转
    {
        double ftemp=x1*y2-x2*y1;
        if(ftemp==0.0)//不转
        return 0;
        if(ftemp>0.0)//左转
        return 1;
        return -1;// 右转
    }
    double Pegx,Pegy,Pegradius;
    bool Fit(int i,int j)//求点到线的距离 与半径比较 看是否合适
    {
        double x1=mem[i].x-Pegx;
        double y1=mem[i].y-Pegy;
        double x2=mem[j].x-Pegx;
        double y2=mem[j].y-Pegy;
        double temp=fabs(x1*y2-y1*x2)/sqrt((mem[i].x-mem[j].x)*(mem[i].x-mem[j].x)+(mem[i].y-mem[j].y)*(mem[i].y-mem[j].y));
        if(temp-Pegradius>=0.0)
        return true;
        return false;
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            if(n<3)
            break;
            scanf("%lf %lf %lf",&Pegradius,&Pegx,&Pegy);
            for(int i=1;i<=n;++i)
            {
                scanf("%lf %lf",&mem[i].x,&mem[i].y);
            }
            mem[0].x=mem[n].x;
            mem[0].y=mem[n].y;
            mem[n+1].x=mem[1].x;
            mem[n+1].y=mem[1].y;
            int i;
            for(i=0;i<n;++i)
            {
                if(Leftturn(mem[i+1].x-mem[i].x,mem[i+1].y-mem[i].y,mem[i+2].x-mem[i+1].x,mem[i+2].y-mem[i+1].y)<0)
                break;
            }
            int j;
            for(j=0;j<n;++j)
            {
                if(Leftturn(mem[j+1].x-mem[j].x,mem[j+1].y-mem[j].y,mem[j+2].x-mem[j+1].x,mem[j+2].y-mem[j+1].y)>0)
                break;
            }
            if(i<n&&j<n)//既存在左转 又存在右转 则一定突出
            {
                printf("HOLE IS ILL-FORMED\n");
                continue;
            }
            if(i<n&&j==n)//如果只有右转 没有左转 说明点的顺序是顺时针 应该颠倒过来 以便后面求解
            {
                reverse(mem,mem+n+2);
            }
            for(i=0;i<n;++i)
            {
                if(Leftturn(Pegx-mem[i].x,Pegy-mem[i].y,mem[i+1].x-Pegx,mem[i+1].y-Pegy)>0)//点在三角形内部的话 则一定<=0
                break;
                if(!Fit(i,i+1))//根据点到直线距离 和 圆半径的比较 看是否合适
                break;
            }
            if(i<n)
            {
                printf("PEG WILL NOT FIT\n");
            }
            else
            {
                printf("PEG WILL FIT\n");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    行转列,列转行
    聚合函数:sum,count,max,avg
    row_number() over partition by 分组聚合
    mysql优化
    hive中not in优化
    DBCP数据库连接池的简单使用
    Eclipse或MyEclipse中给第三方jar包添加源码步骤
    Java中CountDownLatch类的使用
    PLSQL Developer安装、配置、连接oracle数据库
    oracle11g卸载(win10)
  • 原文地址:https://www.cnblogs.com/liulangye/p/2509044.html
Copyright © 2020-2023  润新知