• <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---計(jì)算幾何

            Posted on 2009-09-18 20:10 Uriel 閱讀(552) 評(píng)論(1)  編輯 收藏 引用 所屬分類: POJ計(jì)算幾何
            判斷線段相交問(wèn)題。。用鏈表做的。。(大牛們忽略下文。。)
            第一次完全自己寫鏈表。。搞了一整天。。但是真的好開(kāi)心啊~~
            /*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;

            //計(jì)算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);
            }


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


            //判兩線段相交,不包括端點(diǎn)和部分重合
            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)         //刪除結(jié)點(diǎn) 
            {
                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)                //插入結(jié)點(diǎn) 
            {
                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]))           //如果該直線與前面幾個(gè)線段有交點(diǎn),則刪除代表前面那些線段的結(jié)點(diǎn) 
                    {
                        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);           //第一個(gè)輸入值,創(chuàng)建鏈表 
                        else
                            ADD(
            &Q,i);
                    }

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

                system(
            "PAUSE");
                
            return 0;
            }

            Feedback

            # re: POJ 2653 Pick-up sticks---計(jì)算幾何[未登錄](méi)  回復(fù)  更多評(píng)論   

            2009-09-23 23:02 by intheway
            汗死 我還以為這題要用NlogN的算法導(dǎo)論上的算法,沒(méi)想到暴力才500ms+...
            久久精品欧美日韩精品| 2022年国产精品久久久久| 色99久久久久高潮综合影院| 色偷偷偷久久伊人大杳蕉| 狠狠色丁香婷婷久久综合不卡| 91精品免费久久久久久久久| 亚洲国产成人精品91久久久 | 久久婷婷综合中文字幕| 久久久久国产日韩精品网站| 亚洲国产精品无码久久一线| 婷婷久久综合| 麻豆精品久久精品色综合| 亚洲中文字幕伊人久久无码| 久久91精品国产91久久小草| 伊人久久精品无码二区麻豆| 久久国产成人午夜aⅴ影院| 久久久亚洲欧洲日产国码二区| 久久精品无码专区免费| 久久国产乱子伦精品免费强| 新狼窝色AV性久久久久久| 亚洲国产成人精品女人久久久| 久久中文字幕一区二区| 久久午夜羞羞影院免费观看| 久久夜色精品国产网站| 国色天香久久久久久久小说| 亚洲精品97久久中文字幕无码| 精品久久久久久久中文字幕| 久久91精品国产91久久麻豆| 精品熟女少妇a∨免费久久| 国产成人久久精品一区二区三区| 香蕉aa三级久久毛片| 久久人搡人人玩人妻精品首页| 99久久精品免费看国产| 久久综合欧美成人| 久久综合综合久久97色| 久久99精品久久久久久齐齐| 久久99国产一区二区三区| 国产精品免费久久| 日本亚洲色大成网站WWW久久| 久久综合久久性久99毛片| 思思久久好好热精品国产|