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

            pku 3072

            2009年7月26日

            題目鏈接:PKU 3072 Robot  

            分類:角度旋轉+Dijkastra

            題目分析與算法原型
                     此題也算是最短路的一個變形,計算代價的時候加入了每3個點,兩條邊的夾角的度數,因此需要自己好好的推算一下角度的公式,題目已經提示了用atan2(double,double)這個函數,所以計算的時候把握好3個點中以哪個點為旋轉點,關于旋轉可以有兩個方向,取小于180度的那個方向       

            Code:

              1
            #include<stdio.h>
              2#include<string.h>
              3#include<math.h>
              4#define max 1000000000
              5#define len 25
              6#define pi acos(-1.0)
              7
              8int r,n,visit[len],path[len];
              9double x[len],y[len],map[len][len],dis[len];
             10bool find;
             11
             12void init()
             13{
             14    int i,j;
             15    for(i=1;i<=n;i++)
             16        for(j=1;j<=n;j++)
             17        {
             18            if(i==j)map[i][j]=0;
             19            else
             20            {
             21                double l=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
             22                if(l>r)map[i][j]=max;
             23                else map[i][j]=l;
             24            }

             25        }

             26}

             27double degree(int start,int mid,int end,bool change)
             28{
             29    double ds,d1,d2;
             30
             31    if(!change)d1=atan2(y[mid]-y[start],x[mid]-x[start])*180/pi;
             32    else d1=atan2(y[start]-y[mid],x[start]-x[mid])*180/pi;
             33    d2=atan2(y[end]-y[mid],x[end]-x[mid])*180/pi;
             34    if(d1<0)d1+=360;
             35    if(d2<0)d2+=360;
             36    ds=fabs(d2-d1);
             37    if(ds>180)ds=360-ds;
             38    return ds;
             39}

             40void dij(int v0,int v)
             41{
             42    int i,j,u;
             43    for(i=1;i<n;i++)
             44    {
             45        if(i!=v0&&map[v0][i]<max)
             46        {
             47            double t=degree(n,v0,i,true);
             48            dis[i]=map[v0][i]+t;
             49        }

             50        else dis[i]=map[v0][i];
             51
             52        if(i!=v0&&dis[i]<max)path[i]=v0;
             53        else path[i]=-1;
             54    }

             55    dis[n]=map[v0][n];
             56    visit[v0]=1;
             57    for(i=1;i<n;i++)
             58    {
             59        double min=max;
             60        for(j=1;j<=n;j++)
             61            if(!visit[j]&&dis[j]<min)
             62            {
             63                u=j;
             64                min=dis[j];
             65            }

             66        if(min==max)return ;
             67
             68        if(u==v)
             69        {
             70            find=true;
             71            return ;
             72        }

             73        visit[u]=1;
             74        for(j=1;j<=n;j++)
             75            if(!visit[j]&&map[u][j]<max)
             76            {
             77                double tt=degree(path[u],u,j,false);
             78                if(dis[u]+map[u][j]+tt<dis[j])
             79                {
             80                    dis[j]=dis[u]+map[u][j]+tt;
             81                    path[j]=u;
             82                }

             83            }

             84    }

             85    return ;
             86}

             87
             88int main()
             89{
             90    int i;
             91    while(scanf("%d%d",&r,&n)!=EOF)
             92    {
             93        if(r==-1&&n==-1)break;
             94        for(i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
             95        find=false;
             96        init();
             97        memset(visit,0,sizeof(visit));
             98        dij(1,n);
             99        if(find)printf("%d\n",(int)(dis[n]+0.5));
            100        else printf("impossible\n");
            101    }

            102    return 0;
            103}

            104

            posted on 2009-07-26 17:49 蝸牛也Coding 閱讀(274) 評論(0)  編輯 收藏 引用

            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            一本色综合久久| 办公室久久精品| 国内精品久久久久久99蜜桃| 久久亚洲精品国产亚洲老地址| 国产激情久久久久影院老熟女免费 | 久久久精品2019免费观看| 久久96国产精品久久久| 老司机国内精品久久久久| AA级片免费看视频久久| 久久亚洲国产中v天仙www| 国产高潮国产高潮久久久| 精品国产乱码久久久久久郑州公司| 久久青青色综合| 久久久精品人妻一区二区三区蜜桃| 99久久国产免费福利| 日本欧美国产精品第一页久久| 久久成人18免费网站| 亚洲国产精品一区二区久久hs| 日韩AV无码久久一区二区| 四虎影视久久久免费| 伊人久久无码精品中文字幕| 亚洲国产小视频精品久久久三级| 亚洲婷婷国产精品电影人久久| 久久亚洲国产成人影院| 精品国产一区二区三区久久| 久久天天躁狠狠躁夜夜不卡 | 激情伊人五月天久久综合| 久久精品毛片免费观看| 精品亚洲综合久久中文字幕| 久久精品国产亚洲5555| 亚洲国产成人久久一区WWW| 久久婷婷五月综合成人D啪| 欧美亚洲色综久久精品国产| 久久精品国产精品国产精品污| 国产综合免费精品久久久| 国产精品久久久福利| 精品无码久久久久久久久久| 久久久精品一区二区三区| 久久精品国产免费观看三人同眠| 99久久中文字幕| 欧美麻豆久久久久久中文|