您的位置:首页 > 其它

HDU-1147-Pick-up sticks

2015-07-14 12:25 337 查看
#include<iostream>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
/*
    这道题其实和1086是一样的题目,都是判断线段是否相交;
    但是这道题换了一个问你的方式;他告诉你他依次放木棍的次序;
    并且告诉你木棍的坐标,问你没有被压着的木棍有哪几个,并且按先放的先输出;
    思路: 因为告诉了你木棍摆放的次序,所以先放的只要和后面的有相交,就说明这根木棍被压着了;
           那么我们就可以转换成判断是否相交来判断是否是Top了;
*/
typedef struct
{
    double x,y;
}Point;
//  判断直线AB是否与线段CD相交;
bool Intersect(Point A,Point B,Point C,Point D)
{
    //  直线方程F(x,y)为:(y-y1)*(x1-x2)-(x-x2)*(y1-y2)=0;
    double FC=(C.y-A.y)*(A.x-B.x)-(C.x-A.x)*(A.y-B.y);
    double FD=(D.y-A.y)*(A.x-B.x)-(D.x-A.x)*(A.y-B.y);
    if(FC*FD<=0) return true;
    else return false;
}
Point a[100005],b[100005];
int main()
{
    int n;
    while(~scanf("%d",&n)){
        if(!n) break;
        int TopSticks[1005];    //  存放没有被压着的木棍;
        int c=0;
        for(int i=0;i<n;i++) scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&b[i].x,&b[i].y);
        for(int i=0;i<n-1;i++){
            int flag=1;
            for(int j=i+1;j<n;j++){
                //  如果有相交,那么标记为0,直接查找下一个,
                if(Intersect(a[i],b[i],a[j],b[j])&&Intersect(a[j],b[j],a[i],b[i])){
                    flag=0;
                    break;
                }
            }
            if(flag) TopSticks[c++]=i+1;
        }
        printf("Top sticks: ");
        for(int i=0;i<c;i++){
            printf("%d, ",TopSticks[i]);
        }
        //  因为最后一根木棍肯定是没有被压着的,所以我们在第40行就没有考虑最后一根木棍;
        printf("%d.\n",n);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: