1119. Metro 解题报告 URAL


1119. Metro        解题报告   URAL 


给一个网格,并且表示有某些格子之间可以通过对角线,那么问从左下角到右上角的最短距离!  每个距离是100M,

当时看题目的分类是DP和图论,但是难度才100多点,貌似很简单 的样子,但是看了半天也没想出怎么转移来,以为有的路径可以走斜的,所以一点不一定是从左下角或者左边或者下边转移过来的!  当时自己还画过图看过,还为自己找到了特例而高兴,却不知道这个所谓的特例把自己障碍了……    其实后来自己琢磨明白了,这种情况不会出现,一旦出现就会产生另外的路径将其取代,总之就是一个点只可能从左边,下边,左下转移……

所以程序就很好写了,是不是坐下转移的话,特判一下就好了……

注意这个题的精度,虽说精度不是很严格,但是太过宽松也不是很好的,sart(2.0)=1.414还是不够的,经过*100我把它变成了141.42,终于A掉了,注意double在计算机中的存储,需要加上0.00001等才可能四舍五入,否则还是不能保证精度……

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

#define MAX 1010
int n,m,k;
double map[MAX][MAX];
bool vis[MAX][MAX];
bool isok(int x,int y)
{
    if(x>n||y>m||x<0||y<0)return 0;
    return 1;
}
double min(double a,double b)
{
    return a>b?b:a;
}
int main()
{
    memset(map,0,sizeof(map));
    memset(vis,0,sizeof(vis));

    scanf("%d%d%d",&n,&m,&k);

    int x,y;
    for(int i=0;i<k;++i)
    {
        scanf("%d%d",&x,&y);
        vis[x][y]=1;//
    }

//    map[0][1]=100;
//    map[1][0]=100;
//    if(vis[1][1])map[1][1]=141.4;
//    else map[1][1]=200;


    for(int i=0;i<=n;i++)
    {
        for(int t=0;t<=m;++t)
        {
          double tmp=0;
           if(isok(i-1,t))
           {///1从左边转移
               if(!map[i][t])  map[i][t]=map[i-1][t]+100;
               else map[i][t]=min(map[i][t],map[i-1][t]+100);
           }
           if(isok(i,t-1))
           {///从下边转移
                 if(!map[i][t])  map[i][t]=map[i][t-1]+100;
                else map[i][t]=min(map[i][t],map[i][t-1]+100);
           }
            ///从左下转移
            if(vis[i][t])map[i][t]=min(map[i-1][t-1]+141.423,map[i][t]);///这里根2的精度

        }
    }
    printf("%0.f",map[n][m]+0.0001);///四舍五入,注意double的存储特点……


    return 0;
}
1119. Metro    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值