• <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 閱讀(270) 評論(0)  編輯 收藏 引用

            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久极精品久久久| 91精品国产色综久久 | 亚洲午夜精品久久久久久浪潮 | 欧美黑人激情性久久| 午夜精品久久久久久中宇| 久久国产精品成人免费| 久久久久人妻精品一区三寸蜜桃| 久久综合亚洲鲁鲁五月天| 国产精品毛片久久久久久久| 久久久久国产亚洲AV麻豆| 久久人爽人人爽人人片AV | 伊人久久综合热线大杳蕉下载| 久久亚洲天堂| 一本久久久久久久| 97精品国产97久久久久久免费| 国产精品狼人久久久久影院| 欧美午夜精品久久久久免费视| 成人a毛片久久免费播放| 久久久久久国产精品免费无码 | 韩国三级中文字幕hd久久精品 | 久久精品国产色蜜蜜麻豆| 狠狠色丁香婷婷综合久久来来去 | 2021最新久久久视精品爱| 国产免费久久久久久无码| 精品一区二区久久| 久久精品卫校国产小美女| 亚洲精品tv久久久久久久久久| 国产精品禁18久久久夂久| 伊人久久大香线蕉AV色婷婷色| 久久国内免费视频| 无码精品久久一区二区三区 | 女人香蕉久久**毛片精品| 精品久久久久久无码专区| 狠狠综合久久AV一区二区三区| 亚洲第一永久AV网站久久精品男人的天堂AV| 国产成人精品免费久久久久| 国产A级毛片久久久精品毛片| 久久九九兔免费精品6| 欧美日韩中文字幕久久久不卡| 久久久久国产| 2021国产精品久久精品|