zoukankan      html  css  js  c++  java
  • POJ 2653 Pick-up sticks 线段相交

    题目大意:一次丢下去n根木棒,问那些木棒不被其他木棒压着,依次输出。

    题目思路:叉积判断线段是否相交,吐槽下POJ数据真弱竟然没超时……

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<queue>
    #define INF 0x3f3f3f3f
    #define MAX 100005
    
    struct node
    {
        double x1,y1,x2,y2;
    }point[MAX];
    
    int vis[MAX],n;
    
    double Cross(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
    {
        double a=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
        double b=(x2-x1)*(y4-y1)-(x4-x1)*(y2-y1);
        return a*b;
    }
    
    void Solve()
    {
        for(int i=1;i<n;i++)
        {
            double x1=point[i].x1;
            double y1=point[i].y1;
            double x2=point[i].x2;
            double y2=point[i].y2;
            for(int j=i+1;j<=n;j++)
            {
                if(Cross(x1,y1,x2,y2,point[j].x1,point[j].y1,point[j].x2,point[j].y2)<=1e-10 && Cross(point[j].x1,point[j].y1,point[j].x2,point[j].y2,x1,y1,x2,y2)<=1e-10)
                {
                    vis[i]=1;
                    break;
                }
            }
        }
        printf("Top sticks: ");
        for(int i=1;i<n;i++)
        {
            if(!vis[i])
                printf("%d, ",i);
        }
        printf("%d.
    ",n);
    }
    
    int main()
    {
        while(scanf("%d",&n),n)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%lf%lf%lf%lf",&point[i].x1,&point[i].y1,&point[i].x2,&point[i].y2);
                vis[i]=0;
            }
            Solve();
        }
        return 0;
    }
    View Code
  • 相关阅读:
    学习JavaDay07
    学习JavaDay05
    学习JavaDay0402
    学习JavaDay04
    学习JavaDay03
    学习JavaDay02
    学习JavaDay01
    数据库的增删改查
    关于Spring
    关于多线程Thread的简单应用
  • 原文地址:https://www.cnblogs.com/alan-W/p/6015709.html
Copyright © 2011-2022 走看看