• <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 閱讀(542) 評論(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+...
            国产精品美女久久福利网站| 亚洲精品乱码久久久久久蜜桃不卡 | 婷婷久久综合九色综合绿巨人| 51久久夜色精品国产| 欧美一级久久久久久久大| 一本色综合网久久| 久久99精品久久久久久秒播 | 久久午夜综合久久| 久久精品人人槡人妻人人玩AV | 99久久99久久精品国产片果冻| 久久久久久精品成人免费图片| 国产一区二区三区久久精品| 久久国产香蕉一区精品| 综合人妻久久一区二区精品| 久久久久女教师免费一区| 99久久国产热无码精品免费| 亚洲国产成人久久综合区| 精品久久久久久久久中文字幕| 伊人久久大香线蕉综合5g | 日韩久久无码免费毛片软件| 国产一久久香蕉国产线看观看| 天天影视色香欲综合久久| 久久久久久狠狠丁香| 久久精品国产亚洲77777| 久久精品国产亚洲AV久| 蜜臀久久99精品久久久久久| 情人伊人久久综合亚洲| 国产精品99久久免费观看| 久久久久亚洲AV无码观看| 国产精品99久久久久久宅男小说| 日本一区精品久久久久影院| aaa级精品久久久国产片| 久久狠狠高潮亚洲精品| 国产亚洲精品美女久久久| 欧洲成人午夜精品无码区久久| 久久亚洲精品国产精品婷婷| 色悠久久久久久久综合网| 天天做夜夜做久久做狠狠| 久久99久久99精品免视看动漫| 久久国产欧美日韩精品| 久久久久99精品成人片直播|