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

            分類:角度旋轉(zhuǎn)+Dijkastra

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

            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 閱讀(273) 評(píng)論(0)  編輯 收藏 引用


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


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

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久成人精品无码中文字幕 | 亚洲色欲久久久综合网东京热| 久久久久久久综合综合狠狠| 久久99精品国产麻豆婷婷| 精品久久久久久无码人妻热| 久久精品国产男包| www.久久99| 亚洲精品久久久www| 无码久久精品国产亚洲Av影片 | 久久99免费视频| 久久婷婷五月综合97色直播| 偷偷做久久久久网站| 久久福利青草精品资源站免费| 色综合久久综精品| 久久精品成人欧美大片| 国产一区二区精品久久岳| 亚洲午夜久久久久久久久久| 国产精品丝袜久久久久久不卡| 精品国产青草久久久久福利| 国产精品无码久久久久| 99久久婷婷国产综合亚洲| 欧美久久亚洲精品| 亚洲国产成人久久精品影视| 日产精品久久久一区二区| 无码任你躁久久久久久老妇| 久久精品国产91久久麻豆自制 | 国产精品无码久久综合| 武侠古典久久婷婷狼人伊人| 国产韩国精品一区二区三区久久| 香蕉久久影院| 久久精品国产色蜜蜜麻豆| 国产精品99久久久久久人| 午夜人妻久久久久久久久| 四虎影视久久久免费| 久久精品国产亚洲av瑜伽| 99久久人人爽亚洲精品美女| 91视频国产91久久久| 久久九九精品99国产精品| 久久亚洲中文字幕精品有坂深雪| 久久精品成人欧美大片| 人妻丰满AV无码久久不卡|