• <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+...
            精品免费久久久久国产一区| 久久综合久久伊人| 久久精品国产久精国产果冻传媒| 国内精品人妻无码久久久影院导航| 久久精品国产亚洲77777| 国产精品激情综合久久| 亚洲精品乱码久久久久久| 久久国产美女免费观看精品| 久久午夜伦鲁片免费无码| 国产福利电影一区二区三区久久久久成人精品综合 | 久久er国产精品免费观看8| 色8激情欧美成人久久综合电| 日韩人妻无码一区二区三区久久| 久久综合久久综合久久综合| 久久天天躁狠狠躁夜夜网站 | 日产精品久久久久久久| 国产亚州精品女人久久久久久| 香蕉久久永久视频| 久久国产免费观看精品3| 久久青青草原精品国产不卡| 久久久久成人精品无码中文字幕| 久久影院亚洲一区| 91久久精品电影| 国产精久久一区二区三区| 亚洲午夜久久久久久久久久| 久久久久国产精品三级网| 免费观看成人久久网免费观看| 亚洲香蕉网久久综合影视| 久久婷婷五月综合97色直播| 99久久精品这里只有精品| 久久精品视频网| 欧美亚洲另类久久综合婷婷| 2021精品国产综合久久| 国产成人精品久久一区二区三区av| 亚洲αv久久久噜噜噜噜噜| 久久久久久伊人高潮影院| 一本色道久久88综合日韩精品| 最新久久免费视频| 人人妻久久人人澡人人爽人人精品| 天天爽天天狠久久久综合麻豆| 国产欧美久久久精品影院|