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

            poj 1556 The Doors 最短路 + 線段判交

            代碼有點(diǎn)猥瑣。紀(jì)念下第一道幾何

            Source Code

            Problem: 
            1556  User: hehexiaobai 
            Memory: 1092K  Time: 0MS 
            Language: G
            ++  Result: Accepted 

            Source Code 
            #include
            <iostream> // poj 1556
            #include<cmath>
            #include
            <cstring>
            using namespace std;
            const int MAX = 205;
            const double epsilon = 1e-10;
            const double PI = acos(-1.0);

            double min(double a, double b){ return a > b ? b : a; }
            double max(double a, double b){ return a > b ? a : b; }

            struct Point
            {
                
            double x, y;
                Point(){}
                Point(
            double a, double b): x(a), y(b){}  

                Point 
            operator + (Point b){
                    
            return Point(x + b.x, y + b.y);
                }

                Point 
            operator - (Point b){
                    
            return Point(x - b.x, y - b.y);
                }

                
            double operator * (Point b){
                    
            return x* b.y - y *b.x;
                }

                
            bool operator == (Point b){
                    
            return (fabs(x - b.x)< epsilon) && (fabs(y - b.y) < epsilon);
                }
            };

            Point point[MAX];
            double dis[MAX];
            bool mp[MAX][MAX];
            int nwalls, cntpoint; 

            int direction(Point &p0, Point & p1, Point & p2)//判斷 p0p2是從向量p1p0繞p0的旋轉(zhuǎn)方向
            {
                
            double d = (p2 - p0) * (p1 - p0);
                
            if(fabs(d) < epsilon) return 0;  //共線

                
            if(d > 0.0return 1;  //順時(shí)針
                
                
            return -1;  //逆時(shí)針
            }

            bool inBox(Point &pi, Point & pj, Point &pk)
            {
                
            return min(pi.x , pj.x) <= pk.x && pk.x <= max(pi.x, pj.x) &&
                       min(pi.y , pj.y) 
            <= pk.y && pk.y <= max(pi.y, pj.y);
            }

            bool segmentsIntersect(Point &p1, Point & p2, Point & p3, Point & p4)
            {
                
            int d1 = direction(p3, p4, p1),
                    d2 
            = direction(p3, p4, p2),
                    d3 
            = direction(p1, p2, p3),
                    d4 
            = direction(p1, p2, p4);

                
            if(d1 * d2 < 0  && d3 * d4 <0)
                    
            return true;
                
                
            if( d1 == 0 && inBox(p3, p4, p1))
                    
            return true;

                
            if( d2 == 0 && inBox(p3, p4, p2))
                    
            return true;
                
                
            if( d3 == 0 && inBox(p1, p2, p3))
                    
            return true;

                
            if( d4 ==0 && inBox(p1, p2, p4))
                    
            return true;
                
                
            return false;
            }

            void Dijstra()
            {
                
            int i,j ;
                
            double d[MAX][MAX] ;    
                memset(d, 
            0sizeof d);
                
            for( i = 0; i < cntpoint; i ++)
                    
            for(j = i + 1; j < cntpoint; j++)
                    {
                        d[i][j] 
            = d[j][i] = sqrt((point[i].x - point[j].x) * (point[i].x - point[j].x)
                                                
            + (point[i].y - point[j].y)*(point[i].y - point[j].y));
                    }

                
            const double INF = 1e40;
                
            bool visit[MAX] = {0};

                
            for( i = 0; i < cntpoint; i ++)
                    dis[i] 
            = INF;
                dis[
            0= 0.0

                
            for( i = 0; i <cntpoint; i ++)
                {
                    
            int index = -1;
                    
            double min = INF;
                    
            for(j = 0; j < cntpoint; j ++)
                        
            if(!visit[j] && fabs(dis[j] - min) > epsilon && dis[j] < min)
                        {
                            index 
            = j;
                            min 
            = dis[j];
                        }
                    
                    
            if(index == -1)return;
                    visit[index] 
            = true;

                    
            for( j = 0; j < cntpoint; j ++)
                        
            if(!visit[j] && mp[index][j] == true && dis[j] > dis[index] + d[index][j])
                            dis[j] 
            = dis[index] + d[index][j];

                }
            }

            int main()
            {
                
                
            int i , j;
                
            while(cin >> nwalls)
                {
                    
            if( nwalls == -1)break;
                    
                    memset(point, 
            0sizeof point);
                    memset(mp, 
            0sizeof (mp));
                    memset(dis, 
            0sizeof dis);

                    point[
            0].x = 0.0;
                    point[
            0].y = 5.0;
                    
                    
            double x, y1, y2, y3, y4;
                    cntpoint 
            = 1;
                    
            for(i = 1;i <= nwalls; i ++)
                    {
                        cin 
            >> x >> y1 >> y2 >> y3 >> y4;

                        point[cntpoint].x 
            = x;
                        point[cntpoint].y 
            = 0.0;
                        cntpoint 
            ++;

                        point[cntpoint].x 
            = x;
                        point[cntpoint].y 
            = y1;
                        cntpoint 
            ++;
                        
                        point[cntpoint].x 
            = x;
                        point[cntpoint].y 
            = y2;
                        cntpoint 
            ++;
                        
                        point[cntpoint].x 
            = x;
                        point[cntpoint].y 
            = y3;
                        cntpoint 
            ++;

                        point[cntpoint].x 
            = x;
                        point[cntpoint].y 
            = y4;
                        cntpoint 
            ++;

                        point[cntpoint].x 
            = x;
                        point[cntpoint].y 
            = 10.0;
                        cntpoint 
            ++;
                    }

                    point[cntpoint].x 
            = 10.0;
                    point[cntpoint].y 
            = 5.0;
                    cntpoint 
            ++;
                    
                    
            int tempi, tempj;
                    
                    
            for( i = 0;  i < cntpoint ; i ++)
                        
            for(j = i + 1; j < cntpoint; j ++)
                        {
                            tempi 
            = i / 6;
                            
            if( i % 6 != 0) tempi += 1;
                            
                            tempj 
            = j/6;
                            
            if( j % 6 != 0) tempj += 1;

                            
            if(tempi == tempj)continue;
                            
            if(point[i].y < epsilon || point[j].y < epsilon || 
                                
            10.0 - point[i].y < epsilon || 10.0 - point[j].y < epsilon)
                                    
            continue;
                            
                            
            bool flag = true;
                            
            forint k = tempi + 1; k < tempj; k ++)
                            {
                                
            int t = (k - 1* 6;
                            
            //    if(i == 0 && j == 9){ cout << flag << endl; cout << t << endl; }
                                if(segmentsIntersect(point[i],point[j],point[t + 1],point[t + 2]))flag = false;
                                
            if(segmentsIntersect(point[i],point[j],point[t + 3],point[t + 4]))flag = false;
                                
            if(segmentsIntersect(point[i],point[j],point[t + 5],point[t + 6]))flag = false;
                                
                            }
                            
            if(flag == true)
                            {
                                mp[i][j] 
            = mp[j][i] = true;
                            }
                        }
                    
                
            //    for( i = 0; i < cntpoint; i ++,cout << endl)
                
            //        for(j = 0; j < cntpoint; j ++)
                
            //            cout << mp[i][j] <<" ";
                    
                

                    Dijstra();    
                
            //    for(i = 0; i < cntpoint ; i ++)
                
            //        cout << i <<' '<<dis[i] << endl;

                    cout.precision(
            2);
                    cout 
            <<fixed << dis[cntpoint - 1<< endl;
                }

                
            return 0;
            }
            //0.0 0.0  1.0  1.0   1.0 0.0 1.0 1.0
            //0.0 0.0  1.0  1.0   0.0 1.0 1.0  0.0
            //0.0 0.0  1.0  1.0   1.0 0.0 1.0 0.9


            posted on 2010-12-21 22:32 田兵 閱讀(429) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 幾何


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(2)

            隨筆分類(65)

            隨筆檔案(65)

            文章檔案(2)

            ACM

            搜索

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            四虎国产精品免费久久5151 | 一97日本道伊人久久综合影院| 久久精品国产精品亜洲毛片| 青草久久久国产线免观| 久久精品国产男包| 7777久久亚洲中文字幕| 久久精品中文字幕久久| 亚洲国产精品无码久久久久久曰| 久久SE精品一区二区| 国产精品免费久久久久久久久| 97视频久久久| 成人精品一区二区久久久| 精品久久久无码21p发布| 久久久久一区二区三区| 精品久久久久久中文字幕大豆网 | 国产午夜福利精品久久| 人妻精品久久久久中文字幕一冢本| 亚洲狠狠综合久久| 五月丁香综合激情六月久久| 久久久久久极精品久久久| 国产成人精品久久一区二区三区 | 亚洲国产精品久久久久网站| 一本久久综合亚洲鲁鲁五月天| 久久er热视频在这里精品| 狠狠色丁香久久婷婷综合_中 | 人妻无码αv中文字幕久久| 国产精品无码久久综合网| 无码人妻少妇久久中文字幕蜜桃| 久久久久久亚洲精品无码| 久久亚洲国产欧洲精品一| 国产成人久久精品一区二区三区 | 久久99热这里只有精品国产| 久久综合狠狠综合久久97色| 狠狠色综合久久久久尤物| 麻豆精品久久久一区二区| 久久久久无码精品国产不卡| 亚洲国产精品无码久久久蜜芽 | 午夜精品久久久久久影视777 | 久久婷婷五月综合色高清| 久久人人爽人人爽人人片AV麻烦| 精品久久久久久久久免费影院|