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

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

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            性高朝久久久久久久久久| 久久国产亚洲高清观看| 久久夜色tv网站| 久久国产影院| 狼狼综合久久久久综合网| 色综合久久精品中文字幕首页| 久久久久久久综合日本| 久久精品国产亚洲AV高清热| 国产综合精品久久亚洲| 日产精品久久久一区二区| 韩国三级中文字幕hd久久精品| 99久久国产精品免费一区二区| 亚洲国产精品人久久| 亚洲AV日韩AV永久无码久久| 国产精品美女久久久久av爽| 亚洲精品白浆高清久久久久久 | 亚洲国产精品嫩草影院久久| 国产精品久久久久天天影视| 伊人久久大香线蕉成人| 99久久国产主播综合精品| 性高湖久久久久久久久| 美女久久久久久| 久久精品视屏| 人人狠狠综合久久亚洲婷婷| 中文字幕热久久久久久久| 久久只有这里有精品4| 精品无码人妻久久久久久| 久久99国产精品久久99果冻传媒| 亚洲中文字幕无码久久2017 | 久久99精品九九九久久婷婷| 99久久久精品| 91性高湖久久久久| 久久九九青青国产精品| 国产精品久久成人影院| 国产精品久久国产精品99盘| 91精品国产综合久久婷婷| 久久国产热精品波多野结衣AV| 狠狠色婷婷久久综合频道日韩 | 99久久99久久精品国产片果冻| 久久久亚洲欧洲日产国码是AV| 久久99热这里只频精品6|