hdu 1147线段判断相交问题

pc代码

View Code
hdu 1147
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int N=1002;
const double eps=0.0000000001;//注意设置一个精度

struct node
{
    double ux,uy;
    double lx,ly;
    int num;
    bool tab;
};
queue<node> ss;

double jud1(node a,int x,int y)
{
    return (a.ux-a.lx)*(y-a.ly)-(a.uy-a.ly)*(x-a.lx);
}
bool jud2(node a,int x,int y)
{
    if(a.ux==x&&a.uy==y)return true;
    if(a.lx==x&&a.ly==y)return true;
    return false;
}
bool judtoach(node a,node b)
{
    double k1=jud1(a,b.lx,b.ly);
    double k2=jud1(a,b.ux,b.uy);
    double k3=jud1(b,a.lx,a.ly);
    double k4=jud1(b,a.ux,a.uy);
    if(k1*k2<-eps&&k3*k4<-eps)return true;
    if(k1<eps&&k1>-eps&&jud2(a,b.lx,b.ly))return true;
    if(k2<eps&&k2>-eps&&jud2(a,b.ux,b.uy))return true;
    if(k3<eps&&k3>-eps&&jud2(b,a.lx,a.ly))return true;
    if(k4<eps&&k4>-eps&&jud2(b,a.ux,a.uy))return true;
    return false;
}

int main()
{
    int n;
    node a,b;
    while(scanf("%d",&n),n)
    {
        while(!ss.empty())ss.pop();
        for(int i=0;i<n;i++)
        {
            scanf("%lf%lf%lf%lf",&a.ux,&a.uy,&a.lx,&a.ly);
            a.tab=true;//用tab标记队列队尾,到队尾时及时跳出循环
            a.num=i+1;
            ss.push(a);//用一个队列存储所有没有被覆盖的木棒
            b=ss.front();
            ss.pop();
            while(!b.tab)
            {
                if(judtoach(b,a))//如果这个新加入的木棒与之前一个木棒有交点,把原来的那个木棒去掉
                {
                    b=ss.front();
                    ss.pop();
                    continue;
                }
                ss.push(b);
                b=ss.front();
                ss.pop();
            }
            b.tab=false;
            ss.push(b);
        }
        cout<<"Top sticks:";
        while(1)
        {
            a=ss.front();
            cout<<" "<<a.num;
            ss.pop();
            if(ss.empty()){cout<<"."<<endl;break;}
            else cout<<",";
        }
    }
    return 0;
}

代码

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 
 4 using namespace std;
 5 
 6 typedef struct node
 7 {
 8     double x;
 9     double y;
10 }point;
11 typedef struct ed
12 {
13     point a;
14     point b;
15     int is_top;
16 }edge;
17 edge e[100005];
18 
19 point make_e(point x,point y)
20 {
21     point a;
22     a.x = x.x - y.x;
23     a.y = x.y - y.y;
24     return a;
25 }
26 
27 double cha(point x,point y)
28 {
29     return x.x*y.y - y.x*x.y;
30 }
31 double dian(point x,point y)
32 {
33     return x.x*y.x + y.y*x.y;
34 }
35 double cross(edge a,point c)
36 {
37     point e1,e2;
38     e1 = make_e(a.a,c);
39     e2 = make_e(a.a,a.b);
40     return cha(e2,e1);
41 }
42 
43 int main()
44 {
45     int n,i,j;
46     while(scanf("%d",&n)&&n)
47     {
48         for(i = 0;i < n;i++)
49         scanf("%lf %lf %lf %lf",&e[i].a.x,&e[i].a.y,&e[i].b.x,&e[i].b.y),e[i].is_top = 0;
50         int count = n;
51         for(i = 0;i < n;i++)
52         {
53             for(j = i+1;j < n;j++)
54             {
55                 if(cross(e[i],e[j].a)*cross(e[i],e[j].b) < 0 && cross(e[j],e[i].a)*cross(e[j],e[i].b) < 0)
56                 {
57                     e[i].is_top = 1;
58                     count--;
59                     break;
60                 }
61 
62             }
63         }
64         printf("Top sticks: ");
65         count--;
66         for(i = 0;i < n;i++)
67         {
68             if(e[i].is_top == 0){
69 
70                 printf("%d",i+1);
71                 if(count)
72                 printf(", "),count--;
73                 else
74                 printf(".\n");
75             }
76         }
77     }
78     return 0;
79 }

 

posted @ 2012-08-15 16:04  某某。  阅读(238)  评论(0编辑  收藏  举报