zoukankan      html  css  js  c++  java
  • UVA 1001 Say Cheese

    题意:

      一只母老鼠想要找到她的玩具,而玩具就丢在一个广阔的3维空间上某个点,而母老鼠在另一个点,她可以直接走到达玩具的位置,但是耗时是所走过的欧几里得距离*10s。还有一种方法,就是靠钻洞,洞是球形的,在洞内怎么走都是不耗时间的。求母老鼠找到她的玩具所耗时?

    分析:

      洞到洞的最短距离都是圆心距离减去半径。剩下的就是求单源最短路径。

    代码:

      

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <map>
    using namespace std;
    typedef long long ll;
    const int maxn=102;
    int x[maxn],y[maxn],z[maxn],r[maxn];
    double g[maxn][maxn];
    int vis[maxn];
    double d[maxn];
    double INF = 1e9;
    ll ping(ll x)
    {
    return x*x;
    }
    double dist(int i,int j)
    {
    return sqrt(ping(x[i]-x[j])+ping(y[i]-y[j])+ping(z[i]-z[j]))-r[i]-r[j];
    }
    double dijkstra(int n)
    {
    for(int i=1;i<n;i++)
    d[i]=INF;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++)
    {
    int x;
    double m = INF;
    for(int y=0;y<n;y++)
    if(!vis[y]&&d[y]<m)
    m=d[x=y];
    if(x==n-1)
    return d[n-1];
    vis[x]=1;
    for(int y=0;y<n;y++)
    d[y]=min(d[y],d[x]+g[x][y]);
    }
    return INF;
    }
    int main()
    {
    int n,cas=0;
    while(scanf("%d",&n)&&n>=0)
    {
    memset(r,0,sizeof(r));
    int i,j;
    for(i=1;i<=n;i++)
    scanf("%d%d%d%d",&x[i],&y[i],&z[i],&r[i]);
    scanf("%d%d%d",&x[0],&y[0],&z[0]);
    scanf("%d%d%d",&x[n+1],&y[n+1],&z[n+1]);
    //<<1<<endl;
    for(i=0;i<=n+1;i++)
    {
    for(j=i+1;j<=n+1;j++)
    {
    g[i][j]=max(0.0,dist(i,j));
    g[j][i]=g[i][j];
    }
    }
    printf("Cheese %d: Travel time = %.0lf sec ",++cas,dijkstra(n+2)*10);
    }
    }
  • 相关阅读:
    SQL(二)语法
    SQL(一)简介
    linux学习(六)文件基本属性
    Linux学习(五)远程登录
    Linux学习(四) 忘记密码解决方法
    怎样理解阻塞非阻塞与同步异步的区别?
    Python的lambda匿名函数
    Twisted源码分析系列01-reactor
    Python装饰器学习(九步入门)
    Python关键字yield的解释
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4909117.html
Copyright © 2011-2022 走看看