文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>POJ 2653 Pick-up sticks 解题报告

POJ 2653 Pick-up sticks 解题报告

时间:2010-05-13  来源:MC_ACM

Description

Stan has n sticks of various length. He throws them one at a time on the floor in a random way. After finishing throwing, Stan tries to find the top sticks, that is these sticks such that there is no stick on top of them. Stan has noticed that the last thrown stick is always on top but he wants to know all the sticks that are on top. Stan sticks are very, very thin such that their thickness can be neglected.

Input

Input consists of a number of cases. The data for each case start with 1 <= n <= 100000, the number of sticks for this case. The following n lines contain four numbers each, these numbers are the planar coordinates of the endpoints of one stick. The sticks are listed in the order in which Stan has thrown them. You may assume that there are no more than 1000 top sticks. The input is ended by the case with n=0. This case should not be processed.

Output

For each input case, print one line of output listing the top sticks in the format given in the sample. The top sticks should be listed in order in which they were thrown.

Sample Input

5

1 1 4 2

2 3 3 1

1 -2.0 8 4

1 4 8 2

3 3 6 -2.0

3

0 0 1 1

1 0 2 1

2 0 3 1

0

Sample Output

Top sticks: 2, 4, 5.

Top sticks: 1, 2, 3.

题目大意:给定一堆筷子,依次往下抛,给定筷子的两断点坐标,求哪些筷子在最上面(即那些筷子上面没有其他筷子压着)

思路:判断线段相交,用叉积。

设p=(x1,y1),q=(x2,y2),则pXq=x1*y2-x2*y1,若pXq为正数,则对于原点来说,p在q的顺时针方向上;若pXq为负数,则p在q的逆时针方向上。对于有公共断点的三条线段来说,设该三条线段的向量分别为p1,p2,p3,假设p2在p1的逆时针方向上,p3在p1的顺时针方向上,那么(p2Xp1)*(p3Xp1)必定小于0。

代码:

#include<stdio.h>
#include<stdlib.h>
#define EPS 1e-9
struct point
{
    double x,y;
};
struct Line
{
    point p1,p2;
};
Line line[100002];
double MAX(double a,double b)
{
    return a>b?a:b;
}
double MIN(double a,double b)
{
    return a>b?b:a;
}
double mulit(point p0,point p1,point p2)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cross(Line a,Line b) //判断两线段是否相交

{
    if(MAX(a.p1.x,a.p2.x)>MIN(b.p1.x,b.p2.x)&&
     MAX(b.p1.x,b.p2.x)>MIN(a.p1.x,a.p2.x)&&
     MAX(a.p1.y,a.p2.y)>MIN(b.p1.y,b.p2.y)&&
     MAX(b.p1.y,b.p2.y)>MIN(a.p1.y,a.p2.y)&&
     mulit(a.p1,a.p2,b.p1)*mulit(a.p1,a.p2,b.p2)<EPS&&
     mulit(b.p1,b.p2,a.p1)*mulit(b.p1,b.p2,a.p2)<EPS)
        return 1;
    return 0;
}
int main(void)
{
    int n,i,j;
    while(1)
    {
        scanf("%d",&n);
        if(n==0)break;
        for(i=1;i<=n;i++)
        {
            scanf("%lf %lf %lf %lf",&line[i].p1.x,&line[i].p1.y,&line[i].p2.x,&line[i].p2.y);
        }
        printf("Top sticks:");
        for(i=1;i<=n-1;i++)
        {
            for(j=i+1;j<=n;j++)
            {
                if(cross(line[i],line[j]))
                    break;
                if(j==n) //若没有其他筷子与其相交,则该筷子是最上面筷子之一

                    printf(" %d,",i);
            }
        }
        printf(" %d.\n",n);
    }
    return 0;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载