Say Cheese UVA - 1001

题意:无限大的奶酪里有n(0<=n<=100)个球形的洞。帮助小老鼠A用最短的时间到达小老鼠O所在的位置。奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动。洞和洞可以相交。输入n个球的位置和半径,以及A和O的坐标,求最短时间

思路:1.因为n的大小最多为100,可以用flord

2.注意i和j的距离d[i][j]应该为double,此题答案是四舍五入,floor是向下取整,ceil是向上取整,round是四舍五入

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn = 100 + 2;
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
int n;
double d[maxn][maxn];
struct node
{
    int x,y,z,r;
}p[maxn];
double solve(int aa,int bb)
{
    node a = p[aa];
    node b = p[bb];
    double dd = sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y) + (b.z - a.z) * (b.z - a.z));
    if(dd <= (a.r + b.r)) return 0;
    return dd - a.r - b.r;
}
int main()
{
    int kase = 1;
    while(scanf("%d",&n) && n != -1)
    {
        memset(d,INF,sizeof(d));
        p[0].r = p[n + 1].r = 0;
        for(int i = 1;i <= n;i++)  scanf("%d%d%d%d",&p[i].x,&p[i].y,&p[i].z,&p[i].r);
        scanf("%d%d%d",&p[0].x,&p[0].y,&p[0].z);
        scanf("%d%d%d",&p[n + 1].x,&p[n + 1].y,&p[n + 1].z);
        for(int i = 0;i <= n + 1;i++)
        {
            for(int j = i + 1;j <= n + 1;j++)
            {
                d[i][j] = d[j][i] = solve(i,j);
            }
        }
        for(int k = 0;k <= n + 1;k++)
        {
            for(int i = 0;i <= n + 1;i++)
            {
                for(int j = 0;j <= n + 1;j++)
                {
                    if(d[i][j] < INF && d[k][j] < INF)
                    {
                        d[i][j] = min(d[i][j],d[i][k] + d[k][j]);
                    }
                }
            }
        }
        printf("Cheese %d: Travel time = %g sec\n",kase++,round(d[0][n + 1] * 10));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sgsyacm/article/details/88012503