• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Uriel's Corner

            Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
            posts - 0, comments - 50, trackbacks - 0, articles - 594

            POJ 2653 Pick-up sticks---計算幾何

            Posted on 2009-09-18 20:10 Uriel 閱讀(533) 評論(1)  編輯 收藏 引用 所屬分類: POJ計算幾何
            判斷線段相交問題。。用鏈表做的。。(大牛們忽略下文。。)
            第一次完全自己寫鏈表。。搞了一整天。。但是真的好開心啊~~
            /*Problem: 2653  User: Uriel 
               Memory: 8352K  Time: 750MS 
               Language: C++  Result: Accepted
            */


            #include
            <math.h>
            #include
            <stdio.h>
            #include
            <stdlib.h>
            #define eps 1e-6
            #define MAXN 100001

            typedef 
            struct Node{
                
            struct Node *next;
                
            int flag;
            }
            ;

            typedef 
            struct point{
                
            double x,y;
                
            int mark;
            }
            ;

            point P1[MAXN],P2[MAXN];
            int n;

            //計算cross product (P1-P0)x(P2-P0)
            double xmult(point p1,point p2,point p0)
            {
                
            return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
            }


            //判兩點在線段異側,點在線段上返回0
            int opposite_side(point p1,point p2,point l1,point l2)
            {
                
            return xmult(l1,p1,l2)*xmult(l1,p2,l2)<-eps;
            }


            //判兩線段相交,不包括端點和部分重合
            int intersect_ex(point u1,point u2,point v1,point v2)
            {
                
            return opposite_side(u1,u2,v1,v2)&&opposite_side(v1,v2,u1,u2);
            }


            void creat(Node *L)
            {
                Node 
            *p;

                p
            =(Node *)malloc(sizeof(Node));
                
            if(p==NULL)return ;
                p
            ->flag=P1[0].mark;
                p
            ->next=NULL;
                L
            ->next=p;
            }

                
            void Del(Node *L,int i)         //刪除結點 
            {
                Node 
            *p,*q;
                p
            =L->next;
                q
            =L;
                
            while(p)
                
            {
            //        printf("flag=%d i=%d\n",p->flag,i);
                    if(p->flag==i)
                    
            {
                        q
            ->next=p->next;
                        p
            =q;
                        
            break;
                    }

                    q
            =p;
                    p
            =p->next;
                }

                
            return ;
            }
             

            void Insert(Node *L,int a)                //插入結點 
            {
                Node 
            *p,*s;
                
            int k=1;
                s
            =(Node *)malloc(sizeof(Node));
                
            if(s==NULL)return ;
                p
            =L;
                
            while(p->next!=NULL)
                
            {
                    p
            =p->next;
                }

                p
            ->next=s;
                s
            ->next=NULL;
                s
            ->flag=P1[a].mark;
                
            return ;
            }


            void ADD(Node *S,int i)           
            {
                Insert(S,i);
                Node 
            *p;
                p
            =S->next;
                
            while(p->next!=NULL)
                
            {
            //        printf("flag=%d\n",p->flag);
                    if(intersect_ex(P1[i],P2[i],P1[p->flag-1],P2[p->flag-1]))           //如果該直線與前面幾個線段有交點,則刪除代表前面那些線段的結點 
                    {
                        Del(S,p
            ->flag);
                    }
              
                    p
            =p->next;
                }
                                                      
            }


            void Print(Node *L)                                         //遍歷鏈表,打印 
            {
                Node 
            *p;
                p
            =L->next;
                printf(
            "Top sticks:");
                
            if(p)
                
            {
                    printf(
            " %d",p->flag);
                    p
            =p->next;
                }

                
            while(p)
                
            {
                    printf(
            ", %d",p->flag);
                    p
            =p->next;
                }

            }


            void Free(Node *L)
            {
                Node 
            *p, *q;

                p
            =L->next;
                
            while (p != NULL)
                
            {
                    q
            = p;
                    p
            = p->next;
                    free(q);
                }

                
            }


            int main()
            {
                Node Q;

                
            while(1)
                
            {
                    scanf(
            "%d",&n);
                    
            if(!n)break;
                    
            for(int i=0;i<n;i++)
                    
            {
                        scanf(
            "%lf %lf %lf %lf",&P1[i].x,&P1[i].y,&P2[i].x,&P2[i].y);
                        P1[i].mark
            =i+1;
                        
            if(i==0)creat(&Q);           //第一個輸入值,創建鏈表 
                        else
                            ADD(
            &Q,i);
                    }

                    Print(
            &Q);
                    printf(
            ".\n");
                    Free(
            &Q);
                    Q.next
            =NULL;
                }

                system(
            "PAUSE");
                
            return 0;
            }

            Feedback

            # re: POJ 2653 Pick-up sticks---計算幾何[未登錄]  回復  更多評論   

            2009-09-23 23:02 by intheway
            汗死 我還以為這題要用NlogN的算法導論上的算法,沒想到暴力才500ms+...
            久久精品国产久精国产思思| 成人精品一区二区久久| 色综合久久久久综合99| 97久久婷婷五月综合色d啪蜜芽 | 亚洲人成网站999久久久综合| 国产高潮国产高潮久久久| 中文字幕精品久久久久人妻| 久久久久久国产精品无码超碰| 久久国产成人| 久久se精品一区二区| 亚洲精品高清国产一线久久| 婷婷久久综合九色综合绿巨人 | 久久久精品午夜免费不卡| 国产午夜免费高清久久影院 | 国产亚洲色婷婷久久99精品| 亚洲精品WWW久久久久久| 久久美女网站免费| 久久亚洲欧美国产精品| 蜜臀av性久久久久蜜臀aⅴ| 久久www免费人成精品香蕉| 91精品国产高清久久久久久io| 色欲综合久久中文字幕网| 久久人人爽人人爽AV片| 伊人久久大香线蕉精品不卡| 久久国产亚洲精品麻豆| 久久精品人人做人人爽97| 久久久久亚洲AV成人网人人网站 | 久久国产精品国语对白| 久久精品国产99国产精品澳门| 亚洲午夜久久久影院伊人| 久久这里只有精品首页| 日韩人妻无码一区二区三区久久99| 91精品观看91久久久久久| 国内精品欧美久久精品| 91性高湖久久久久| 国产91色综合久久免费| 99精品久久久久中文字幕| 久久久久女人精品毛片| 国产精品久久久久久久久免费| 久久久婷婷五月亚洲97号色| 精品久久久久香蕉网|