• <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>

            學習心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據結果的正負來判斷給的點集的時針方向?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫的這個get_fail() 好像并是真正的get_fail,也是說fail指向的串并不是當前結點的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄]
            • 這個是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評論內容較長,點擊標題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

            代碼比較長,寫蹉了……

            #include <iostream>
            #include 
            <algorithm>
            #include 
            <math.h>
            #include 
            <string.h>
            #define eps 1e-7

            using namespace std;

            struct point{double x, y, angle, dis;};

            int sig(double a)
            {
            return (a > eps) - (a < -eps);}

            double dist(point a, point b)
            {
            return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}

            double cross(point a,point b,point c)
            {
            return (a.x - c.x)*(b.y - c.y) - (a.y - c.y)*(b.x - c.x);}

            double mul(point a, point b)
            {
            return a.x*b.x + a.y*b.y;}

            double mod(point a)
            {
            return a.x*a.x + a.y*a.y;}

            double jiajiao(point a, point b)
            {
                
            if(!sig(mul(a,b)-(mod(a)*mod(b)))) return 0;
                
            return acos(mul(a,b)/sqrt(mod(a)*mod(b)));
            }

            bool cmp(point a, point b)
            {
                
            return !sig(a.angle-b.angle) && sig(a.dis-b.dis)<0 || sig(a.angle-b.angle)<0;
            }

            point m0[
            1001], m1[1001], h0[1001], h1[1001], ray, base;
            int len0, len1, id0[1001], id1[1001];
            //m1 m2 原始點集  h1 h2凸包 ray基準向量 base基準點 
            //len[0]是 h[0]的長度 
            int n;

            void read()
            {
                
            for(int i = 0; i < n; i ++)
                    scanf(
            "%lf %lf"&m0[i].x, &m0[i].y);
                
            for(int i = 0; i < n; i ++)
                    scanf(
            "%lf %lf"&m1[i].x, &m1[i].y);
            }

            void tubao0()
            {
                point a 
            = m0[0];
                
            int j = 0, i;
                
            for(i = 1; i < n; i ++)
                
            if(m0[i].y==a.y&&m0[i].x<a.x || m0[i].y<a.y)
                {
                    j 
            = i;
                    a 
            = m0[i];
                }
                swap(m0[
            0] , m0[j]);    
                m0[
            0].angle = 0;
                
            for(i = 1; i < n; i ++)
                {
                    m0[i].angle 
            = atan2(m0[i].y - m0[0].y, m0[i].x - m0[0].x);
                    m0[i].dis 
            = dist(m0[0], m0[i]);
                }
                sort(m0 
            + 1, m0 + n, cmp);
                
            int top = 0;
                id0[
            0= n - 1;
                h0[top 
            ++= m0[n-1];
                id0[
            1= 0;
                h0[top 
            ++= m0[0];    
                
            if( sig( m0[1].angle - m0[n-1].angle ) == 0 )
                {
                    id0[top] 
            = 1;
                    h0[top 
            ++= m0[1];      
                }
                
            else
                {
                    
            for(i = 1;i < n; i ++)
                    {
                        
            if(sig(cross(m0[i], h0[top-2], h0[top-1])) > 0)
                        {
                            id0[top] 
            = i;
                            h0[top 
            ++= m0[i];    
                        }
                        
            else
                        {
                            top 
            --;
                            i 
            --;
                        }    
                    }
                }
                len0 
            = top;
                
            }
            void tubao1()
            {
                point a 
            = m1[0];
                
            int j = 0, i;
                
            for(i = 1; i < n; i ++)
                
            if(m1[i].y==a.y&&m1[i].x<a.x || m1[i].y<a.y)
                {
                    j 
            = i;
                    a 
            = m1[i];
                }
                swap(m1[
            0] , m1[j]);    
                m1[
            0].angle = 0;
                
            for(i = 1; i < n; i ++)
                {
                    m1[i].angle 
            = atan2(m1[i].y - m1[0].y, m1[i].x - m1[0].x);
                    m1[i].dis 
            = dist(m1[0], m1[i]);
                }
                sort(m1 
            + 1, m1 + n, cmp);
                
            //for(i=0;i<n;i++)printf("%lf %lf\n",m0[i].x,m0[i].y);
                int top = 0;
                id1[
            0= n - 1;
                h1[top 
            ++= m1[n-1];
                id1[
            1= 0;
                h1[top 
            ++= m1[0];    
                
            if( sig( m1[1].angle - m1[n-1].angle ) == 0 )
                {
                    id1[top] 
            = 1;
                    h1[top 
            ++= m1[1];         
                }
                
            else
                {
                    
            for(i = 1;i < n; i ++)
                    {
                        
            if(sig(cross(m1[i], h1[top-2], h1[top-1])) > 0)
                        {
                            id1[top] 
            = i;
                            h1[top 
            ++= m1[i];    
                        }
                        
            else
                        {
                            top 
            --;
                            i 
            --;
                        }    
                    }
                }
                len1 
            = top;
                
            }

            void pre()
            {
                point tt;
                ray.x 
            = h0[2].x - h0[1].x;
                ray.y 
            = h0[2].y - h0[1].y;
                swap(m0[id0[
            1]], m0[0]);
                m0[
            0].angle = 0;
                m0[
            0].dis = 0;
                
            for(int i = 1; i < n; i ++)
                {
                    tt.x 
            = m0[i].x - m0[0].x;
                    tt.y 
            = m0[i].y - m0[0].y;
                    m0[i].angle 
            = jiajiao(tt, ray);
                    m0[i].dis 
            = dist(m0[0], m0[i]);
                }
                sort(m0 
            + 1,m0 + n, cmp);
            }

            double enum_()
            {
                
            int i, j, flag;
                point tray, tbase, tt;
                
            double angle, minans = 9999999;
                h1[len1] 
            = h1[0];
                
            for(i = 0; i<= len1; i ++)
                {
                    tray.x 
            = h1[i + 1].x - h1[i].x;
                    tray.y 
            = h1[i + 1].y - h1[i].y;
                    angle 
            = jiajiao(tray, ray);
                    
            //printf("ray:%lf %lf tray:%lf %lf angle = %lf\n",ray.x,ray.y,tray.x,tray.y,angle);

                    m1[
            0].angle = 0;
                    m1[
            0].dis = 0;
                    
            for(j = 0; j < n; j ++)
                    {
                        tt.x 
            = m1[j].x - h1[i].x;
                        tt.y 
            = m1[j].y - h1[i].y;
                        m1[j].angle 
            = jiajiao(tt, tray);
                        m1[j].dis 
            = dist(h1[i], m1[j]);
                    }
                    sort(m1, m1 
            + n, cmp);
                    
                    
            //for(j=0;j<n;j++)printf("%lf %lf\n",m1[j].x,m1[j].y); puts("");
                    
            //for(j=0;j<n;j++)printf("%lf %lf\n",m0[j].x,m0[j].y); puts("");
                        
                    flag 
            = 0;
                    
            for(j = 1; j < n; j ++)
                    {
                        
            //printf("%lf %lf %lf %lf\n",m0[j].angle,m1[j].angle,m0[j].dis,m1[j].dis);
                        if(sig(m0[j].angle - m1[j].angle) || sig(m0[j].dis - m1[j].dis))
                        {
                            flag 
            = 1;
                            
            break;
                        }
                    }
                    
            //printf("%d\n",flag);
                    if(!flag)
                    {
                        
            double xx = jiajiao(tray, ray);
                        
            if(sig(minans - xx) > 0) minans = xx;
                    }
                }
                
            return minans;
            }

            int main()
            {
                
            double ans;
                
            int i;
                
            //freopen("in.txt","r",stdin);
                
            //freopen("out.txt","w",stdout);
                while(scanf("%d"&n) , n)
                {    
                    read();
                    
            if(n == 1)
                    {
                        
            double x = 0;
                        printf(
            "%.10lf\n",x);
                        
            continue;
                    }
                    
            if(n == 2)
                    {
                        point a, b, c;
                        a.x 
            = m0[0].x - m0[1].x;    a.y = m0[0].y - m0[1].y;
                        b.x 
            = m0[1].x - m0[0].x;    b.y = m0[1].y - m0[0].y;
                        c.x 
            = m1[0].x - m1[1].x;    c.y = m1[0].y - m1[1].y;
                        printf(
            "%.10lf\n",min(jiajiao(a,c),jiajiao(b,c)));
                        
            continue;
                    }
                    tubao0();
                    tubao1();
                    
            //for(i=0;i<=len0;i++)printf("%lf %lf\n",h0[i].x,h0[i].y);
                    
            //for(i=0;i<=len1;i++)printf("%lf %lf\n",h1[i].x,h1[i].y);
                    pre();
                    ans 
            = enum_();
                    printf(
            "%.10lf\n",ans);
                }
                
            //while(1);
            }

            posted on 2009-08-16 00:52 superlong 閱讀(237) 評論(1)  編輯 收藏 引用

            Feedback

            # re: HOJ 11482 2009-08-16 09:14 csuft1
            呵呵..把代碼發在這里很不錯..以后我也試試...百度的編輯器太爛了....  回復  更多評論
              

            亚洲综合伊人久久综合| 亚洲国产精久久久久久久| 亚洲精品高清一二区久久| 大香伊人久久精品一区二区| 久久综合国产乱子伦精品免费| 91视频国产91久久久| 色偷偷88欧美精品久久久| 久久精品中文闷骚内射| 久久久久一本毛久久久| 久久久久亚洲AV无码麻豆| 国产亚州精品女人久久久久久 | 国产精品久久久久久影院| 久久精品国产72国产精福利| 亚洲国产欧洲综合997久久| 久久AAAA片一区二区| 亚洲精品无码成人片久久| 久久九九久精品国产| 久久一日本道色综合久久| 欧美午夜精品久久久久久浪潮| 97精品伊人久久大香线蕉app| 久久精品免费大片国产大片| 久久久久亚洲精品天堂| 一本大道久久香蕉成人网| 久久综合中文字幕| 精品熟女少妇a∨免费久久| 97香蕉久久夜色精品国产| 久久综合伊人77777| 热re99久久精品国产99热| 久久久久高潮综合影院| 狠狠色丁香久久婷婷综合图片| 99久久99久久精品国产| 99久久国产综合精品麻豆| 久久这里只有精品18| 欧美一区二区三区久久综| 亚洲第一极品精品无码久久| 久久只有这里有精品4| 久久精品无码专区免费| 国产99久久久国产精免费| 国产91久久综合| 欧美午夜精品久久久久久浪潮| 亚洲国产成人精品91久久久|