题意:无限大的奶酪里有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;
}