• <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 閱讀(542) 評(píng)論(1)  編輯 收藏 引用 所屬分類: POJ計(jì)算幾何
            判斷線段相交問題。。用鏈表做的。。(大牛們忽略下文。。)
            第一次完全自己寫鏈表。。搞了一整天。。但是真的好開心啊~~
            /*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ì)算幾何[未登錄]  回復(fù)  更多評(píng)論   

            2009-09-23 23:02 by intheway
            汗死 我還以為這題要用NlogN的算法導(dǎo)論上的算法,沒想到暴力才500ms+...
            精品国产99久久久久久麻豆| 香蕉久久AⅤ一区二区三区| 久久99精品久久久久久齐齐| 伊人久久大香线蕉av不卡 | 99久久免费国产精品| 久久亚洲精品无码aⅴ大香 | 99国产精品久久| 日日噜噜夜夜狠狠久久丁香五月| 色欲综合久久躁天天躁| 热综合一本伊人久久精品| 国内精品久久久久影院网站| 99久久婷婷国产综合亚洲| 少妇精品久久久一区二区三区| 99久久无色码中文字幕人妻| 久久久久人妻一区二区三区| 久久婷婷五月综合国产尤物app| 女同久久| 亚洲精品无码久久久久sm| 精品国产青草久久久久福利| 亚洲国产精品无码久久久蜜芽| 少妇内射兰兰久久| 99久久精品国产麻豆| 久久精品一区二区国产| 秋霞久久国产精品电影院| 国产一区二区精品久久岳| 久久久久黑人强伦姧人妻| 婷婷国产天堂久久综合五月| 久久综合久久美利坚合众国| 久久棈精品久久久久久噜噜| 久久精品国产一区| 99久久综合国产精品免费| 久久久久久午夜成人影院| 66精品综合久久久久久久| 久久青青色综合| 久久天天躁狠狠躁夜夜avapp| 四虎国产永久免费久久| 日本亚洲色大成网站WWW久久 | 久久天天躁夜夜躁狠狠躁2022| 狠狠色狠狠色综合久久| 久久96国产精品久久久| 日韩一区二区久久久久久 |