• <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>
            應用平面圖的歐拉定理:V + F - E = 2
            兩兩線段求交,得到交點數 V,然后判斷每個交點落在幾條邊上,如果一個點在一條邊上,這條邊就分裂成兩條邊,邊數加 1。這樣得到邊數 E。最后直接用歐拉定理解得 F。


            /*************************************************************************
            Author: WHU_GCC
            Created Time: 2007-8-20 12:52:55
            File Name: pku2284.cpp
            Description: 
            ***********************************************************************
            */

            #include 
            <iostream>
            #include 
            <cmath>
            using namespace std;
            #define out(x) (cout<<#x<<": "<<x<<endl)
            const int maxint=0x7FFFFFFF;
            typedef 
            long long int64;
            const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;
            template
            <class T>void show(T a, int n){for(int i=0; i<n; ++i) cout<<a[i]<<' '; cout<<endl;}
            template
            <class T>void show(T a, int r, int l){for(int i=0; i<r; ++i)show(a[i],l);cout<<endl;}

            const double INF = 1e200;
            const double EP = 1e-10;

            struct point_t
            {
                
            double x, y;
                point_t(
            double a = 0double b = 0)
                
            {
                    x 
            = a;
                    y 
            = b;
                }

            }
            ;

            struct lineseg_t
            {
                point_t s, e;
                lineseg_t (point_t a, point_t b)
                
            {
                    s 
            = a;
                    e 
            = b;
                }

                lineseg_t()
                
            {}
            }
            ;

            struct line_t
            {
                
            double a, b, c;
            }
            ;

            bool operator <(point_t p1, point_t p2)
            {
                
            return p1.x < p2.x || p1.x == p2.x && p1.y < p2.y;
            }



            bool operator ==(point_t p1, point_t p2)
            {
                
            return abs(p1.x - p2.x) < EP && abs(p1.y - p2.y) < EP;
            }


            double multiply(point_t sp, point_t ep, point_t op)
            {
                
            return (sp.x - op.x) * (ep.y - op.y) - (ep.x - op.x) * (sp.y - op.y);
            }


            bool online(lineseg_t l, point_t p)
            {
                
            return abs(multiply(l.e, p, l.s)) < EP && (p.x - l.s.x) * (p.x - l.e.x) < EP && (p.y - l.s.y) * (p.y - l.e.y) < EP;
            }


            bool lineintersect(line_t l1, line_t l2, point_t &p)
            {
                
            double d = l1.a * l2.b - l2.a * l1.b;
                
            if (abs(d) < EP) return false;
                p.x 
            = (l2.c * l1.b - l1.c * l2.b) / d;
                p.y 
            = (l2.a * l1.c - l1.a * l2.c) / d;
                
            return true;
            }


            line_t makeline(point_t p1, point_t p2)
            {
                line_t t1;
                
            int sign = 1;
                t1.a 
            = p2.y - p1.y;
                
            if (t1.a < 0)
                
            {
                    sign 
            = -1;
                    t1.a 
            = sign * t1.a;
                }

                t1.b 
            = sign * (p1.x - p2.x);
                t1.c 
            = sign * (p1.y * p2.x - p1.x * p2.y);
                
            return t1;
            }


            bool intersection(lineseg_t l1, lineseg_t l2, point_t &p)
            {
                line_t ll1, ll2;
                ll1 
            = makeline(l1.s, l1.e);
                ll2 
            = makeline(l2.s, l2.e);
                
            if (lineintersect(ll1, ll2, p))
                    
            return online(l1, p) && online(l2, p);
                
            else return false;
            }


            const int maxn = 100000;
            point_t p[maxn];
            int n;

            point_t inter[maxn];
            int cnt_inter;

            int main()
            {
                
            int ca = 1;
                
            while (scanf("%d"&n), n != 0)
                
            {
                    
            for (int i = 0; i < n; i++)
                        scanf(
            "%lf%lf"&p[i].x, &p[i].y);
                    
                    cnt_inter 
            = 0;
                    
            for (int i = 0; i < n; i++)
                        
            for (int j = 0; j < n; j++)
                        
            {
                            lineseg_t l1(p[i], p[(i 
            + 1% n]), l2(p[j], p[(j + 1% n]);
                            point_t p;
                            
            if (intersection(l1, l2, p))
                                inter[cnt_inter
            ++= p;
                        }

                    sort(inter, inter 
            + cnt_inter);
                    cnt_inter 
            = unique(inter, inter + cnt_inter) - inter;
                    
                    
            int e = 0;
                    
            for (int i = 0; i < cnt_inter; i++)
                    
            {
                        
            for (int j = 0; j < n; j++)
                        
            {
                            lineseg_t t(p[j], p[(j 
            + 1% n]);
                            
            if (online(t, inter[i]) && !(t.s == inter[i]))
                                e
            ++;
                        }

                    }

                    printf(
            "Case %d: There are %d pieces.\n", ca++, e + 2 - cnt_inter);
                }

                
            return 0;
            }
            posted on 2007-08-21 17:26 Felicia 閱讀(353) 評論(0)  編輯 收藏 引用 所屬分類: 計算幾何
             
            国产精品岛国久久久久| 久久夜色tv网站| 日本高清无卡码一区二区久久 | 久久精品亚洲福利| 久久久久精品国产亚洲AV无码| 色偷偷88888欧美精品久久久| 99久久免费国产特黄| 久久99久久成人免费播放| 精产国品久久一二三产区区别| AV无码久久久久不卡蜜桃| 国内精品久久久久| 99久久人妻无码精品系列| 亚洲国产精品高清久久久| 亚洲午夜精品久久久久久app| 热久久这里只有精品| 精品综合久久久久久98| 精品久久综合1区2区3区激情| 亚洲AV日韩AV天堂久久| 色综合久久中文字幕综合网| 国产欧美久久久精品| 久久免费的精品国产V∧| 精品多毛少妇人妻AV免费久久| 91久久精品国产91性色也| 久久狠狠色狠狠色综合| 亚洲精品白浆高清久久久久久| 欧美亚洲另类久久综合婷婷| 中文字幕亚洲综合久久| 91精品国产乱码久久久久久| 亚洲精品无码久久一线| 免费精品国产日韩热久久| 热综合一本伊人久久精品| 国产免费久久久久久无码| 一本久久精品一区二区| 久久久久亚洲?V成人无码| 久久综合色之久久综合| 99久久精品免费看国产免费| 久久精品国产精品青草| 九九99精品久久久久久| 青青国产成人久久91网| 久久久久久久综合综合狠狠| 欧美国产成人久久精品|