SSL-ZYC 1615 Frogger

题目大意:
有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;
}

转载于:https://www.cnblogs.com/hello-tomorrow/p/9313139.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值