您的位置:首页 > 其它

SSL-ZYC 1615 Frogger

2018-01-13 14:22 204 查看
题目大意:

有n个石头,给出每个石头的坐标位置,请你求出第一个石头到第二个石头的一条路径满足这条路径中距离最远的相连的两个石头的距离最近。

注意:每个测试点有多组数据。

思路:

这道题的方法有很多,我用的方法是最小生成树,每组数据都进行一次寻找,并输出。

这道题是一道考细节的题,程序代码虽然并不是很长的那种,但是打出来非常的乱,有许多值得注意的细节,每一个都不能错。

另外,求两点之间的距离的方法——勾股定理详见我的博客 剑鱼行动

代码:

(很乱,大家见谅,谢谢!)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int b[201],n,x[201],y[201],k,m,sum,d[201];
double f[201][201],a[201],minn,c[1001],maxn;

double gogu(int x1,int x2,int y1,int y2)  //勾股定理
{
return sqrt(abs(x1-x2)*abs(x1-x2)+abs(y1-y2)*abs(y1-y2));
}

int main()
{
scanf("%d",&n);
while (n!=0)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
f[i][j]=f[j][i]=99999999;  //初始化
for (int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
for (int j=1;j<=i-1;j++)
f[j][i]=f[i][j]=gogu(x[i],x[j],y[i],y[j]);  //求两点之间的距离
}
m=0;
memset(c,0,sizeof(c));
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
b[1]=1;  //进入集合
for (int i=1;i<=n;i++)
a[i]=f[1][i];  //初始化,求每一个点到集合的最短距离
for (int j=1;j<=n-1;j++)
{
minn=2147483647;
for (int i=1;i<=n;i++)
if (b[i]==0&&a[i]<minn)
{
k=i;
minn=a[i];  //寻找最短距离
}
m++;
b[k]=1;  //进入集合
c[m]=a[k];  //长度标记
if (k==2) break;  //如果是第二个石头(终点)就退出寻找
for (int i=1;i<=n;i++)
if (b[i]==0&&a[i]>f[i][k]) a[i]=f[i][k];  //重新计算每个点到集合的距离
}
sum++;
maxn=0;
for (int i=1;i<=m;i++)
if (maxn<c[i]) maxn=c[i];  //寻找最大值
printf("Scenario #%d\nFrog Distance = %0.3lf\n\n",sum,maxn);  //输出该数据的答案
scanf("%d",&n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: