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

            poj1556

            The Doors

            Time Limit: 1000MS Memory Limit: 10000K
            Total Submissions: 3721 Accepted: 1604

            Description

            You are to find the length of the shortest path through a chamber containing obstructing walls. The chamber will always have sides at x = 0, x = 10, y = 0, and y = 10. The initial and final points of the path are always (0, 5) and (10, 5). There will also be from 0 to 18 vertical walls inside the chamber, each with two doorways. The figure below illustrates such a chamber and also shows the path of minimal length.

            Input

            The input data for the illustrated chamber would appear as follows.

            2
            4 2 7 8 9
            7 3 4.5 6 7

            The first line contains the number of interior walls. Then there is a line for each such wall, containing five real numbers. The first number is the x coordinate of the wall (0 < x < 10), and the remaining four are the y coordinates of the ends of the doorways in that wall. The x coordinates of the walls are in increasing order, and within each line the y coordinates are in increasing order. The input file will contain at least one such set of data. The end of the data comes when the number of walls is -1.

            Output

            The output should contain one line of output for each chamber. The line should contain the minimal path length rounded to two decimal places past the decimal point, and always showing the two decimal places past the decimal point. The line should contain no blanks.

            Sample Input

            1
            5 4 6 7 8
            2
            4 2 7 8 9
            7 3 4.5 6 7
            -1

            Sample Output

            10.00
            10.06
            這是黑書上的題目,貌似簡化了些
            做法就不解釋了
            主要是處理細節,主要判斷線段是否相交//只考慮規范相交即可
             
            構圖后求最短路即可
             
            #include<algorithm>
            #include
            <iostream>
            #include
            <string>
            #include
            <math.h>
            #define inf 0x7ffffff
            #define max 100
            using namespace std;
            int n;
            struct point
            {
                
            double x,y;
            }
            ;
            struct node
            {
                
            int u,v;
            }
            ;
            double wx[20];//每堵墻x坐標
            point p[max];
            int psize;
            double py[20][4];
            double g[max][max];
            node e[max
            *max];
            int esize;
            double dis(point a,point b)
            {
                
            return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
            }

            double cross(double x1,double y1,double x2,double y2,double x3,double y3)//判斷point3在線段(1,2)上面還是下面,叉積
            {
                
            return (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
            }

            bool isok(point a,point b)//判斷兩點之間能不能連邊
            {
                
            if (a.x>=b.x) return false;
                
            bool flag=true;
                
            int i;
                i
            =0;
                
            while (wx[i]<=a.x&&i<n) i++;
                
            while(wx[i]<b.x && i<n)
                
            {
                    
            if (   cross(a.x,a.y,b.x,b.y,wx[i],0)*cross(a.x,a.y,b.x,b.y,wx[i],py[i][0])<0
                        
            || cross(a.x,a.y,b.x,b.y,wx[i],py[i][1])*cross(a.x,a.y,b.x,b.y,wx[i],py[i][2])<0
                        
            || cross(a.x,a.y,b.x,b.y,wx[i],py[i][3])*cross(a.x,a.y,b.x,b.y,wx[i],10)<0)
                    
            {
                        flag
            =false;
                        
            break;
                    }

                    i
            ++;
                }

                
            return flag;
            }

            double bellmanford(int beg,int end)//求最短路 這里邊數相對較少,也可用spfa,或其他
            {
                
            bool ex=true;
                
            double d[max];
                
            int i,j;
                
            for(i=0;i<max;i++) d[i]=inf;
                d[beg]
            =0;
                
            for(i=0;i<psize && ex;i++)
                
            {
                    ex
            =false;
                    
            for(j=0;j<esize;j++)
                    
            {
                        
            if (d[e[j].u]<inf  && d[e[j].v]>d[e[j].u]+g[e[j].u][e[j].v])
                        
            {
                            d[e[j].v]
            =d[e[j].u]+g[e[j].u][e[j].v];
                            ex
            =true;
                        }

                    }

                }

                
            return d[end];
            }

            void solve()
            {
                
            int i,j;
                p[
            0].x=0;
                p[
            0].y=5;
                psize
            =1;
                
            for(i=0; i<n; i++)
                
            {
                    scanf(
            "%lf",&wx[i]);
                    
            for(j=0; j<4; j++)
                    
            {
                        p[psize].x
            =wx[i];
                        scanf(
            "%lf",&p[psize].y);
                        py[i][j]
            =p[psize].y;
                        psize
            ++;
                    }

                }

                p[psize].x
            =10;
                p[psize].y
            =5;
                psize
            ++;
                
            for(i=0; i<psize; i++)
                
            {
                    
            for(j=0; j<psize; j++)
                    
            {
                        g[i][j]
            =inf;
                    }

                }

                esize
            =0;
                
            for(i=0; i<psize; i++)
                    
            for(j=i+1; j<psize; j++)
                    
            {
                        
            if (isok(p[i],p[j]))
                        
            {
                            g[i][j]
            =dis(p[i],p[j]);
                            e[esize].u
            =i;
                            e[esize].v
            =j;
                            esize
            ++;
                        }

                    }

                printf(
            "%.2lf\n",bellmanford(0,psize-1));
            }

            int main()
            {
                
            while(scanf("%d",&n)!=EOF&&n!=-1)
                
            {
                    solve();
                }

                
            return 0;
            }

             

            posted on 2012-04-03 00:53 jh818012 閱讀(273) 評論(0)  編輯 收藏 引用

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統計

            常用鏈接

            留言簿

            文章檔案(85)

            搜索

            最新評論

            • 1.?re: poj1426
            • 我嚓,,輝哥,,居然搜到你的題解了
            • --season
            • 2.?re: poj3083
            • @王私江
              (8+i)&3 相當于是 取余3的意思 因為 3 的 二進制是 000011 和(8+i)
            • --游客
            • 3.?re: poj3414[未登錄]
            • @王私江
              0ms
            • --jh818012
            • 4.?re: poj3414
            • 200+行,跑了多少ms呢?我的130+行哦,你菜啦,哈哈。
            • --王私江
            • 5.?re: poj1426
            • 評論內容較長,點擊標題查看
            • --王私江
            久久久中文字幕日本| 国产精品美女久久久m| 伊人久久综在合线亚洲2019| 日本免费久久久久久久网站| 久久免费视频一区| 国产69精品久久久久9999APGF| 亚洲狠狠婷婷综合久久蜜芽| 亚洲狠狠综合久久| 久久天天躁狠狠躁夜夜2020| 国内精品伊人久久久久777| 久久亚洲国产中v天仙www| 亚洲人成无码久久电影网站| 国产成人久久精品激情| 亚洲欧美日韩精品久久亚洲区| 久久精品人人槡人妻人人玩AV| 狠狠色婷婷久久综合频道日韩 | 欧美一区二区精品久久| 亚洲日本va中文字幕久久| 国产成人久久久精品二区三区| 久久精品国产亚洲av麻豆小说 | 99精品久久精品一区二区| 国内精品伊人久久久久网站| 色综合色天天久久婷婷基地| 99久久精品免费看国产一区二区三区| 久久精品国产免费一区| 伊人久久综合热线大杳蕉下载| 无码国产69精品久久久久网站| 久久受www免费人成_看片中文| 岛国搬运www久久| 国产精品久久影院| 国产免费久久精品99久久| 国产亚洲色婷婷久久99精品| 精品久久久久久成人AV| 亚洲精品无码久久久久久| 久久AV无码精品人妻糸列| 午夜不卡久久精品无码免费| 亚洲日本va午夜中文字幕久久| 久久综合亚洲色HEZYO国产| 久久精品国产一区二区电影| 蜜桃麻豆WWW久久囤产精品| 久久丫精品国产亚洲av不卡|