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


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


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

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            成人久久综合网| 久久成人小视频| 国产精品久久久久乳精品爆| 美女久久久久久| 亚洲AV日韩AV永久无码久久| 国产无套内射久久久国产| 国内精品久久久久久久久电影网| 久久99毛片免费观看不卡| 亚洲精品无码久久久久AV麻豆| 亚洲午夜久久久影院伊人| 91麻豆精品国产91久久久久久| 久久久久av无码免费网| 久久久久久噜噜精品免费直播| 久久久久无码精品国产| 欧美日韩中文字幕久久久不卡| 国产精品免费福利久久| 少妇人妻综合久久中文字幕| 99久久精品久久久久久清纯| 久久精品国产99久久无毒不卡 | 亚洲欧美日韩精品久久亚洲区 | 久久无码高潮喷水| 精品国产综合区久久久久久| 国产精品9999久久久久| 亚洲国产精品久久电影欧美| 亚洲人成无码久久电影网站| 亚洲综合婷婷久久| 99久久免费国产精品热| 久久久久亚洲Av无码专| 午夜欧美精品久久久久久久| 精品久久久久久无码不卡| 久久久精品视频免费观看| 成人a毛片久久免费播放| 精品久久久久久久| 久久婷婷五月综合97色一本一本| 久久久无码精品亚洲日韩京东传媒 | 久久国产精品一区| 亚洲国产成人久久综合碰碰动漫3d | 日产精品99久久久久久| 亚洲欧美成人综合久久久| 久久亚洲AV无码精品色午夜| 国产精品久久久久久五月尺|