本文主要是介绍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;
}
这篇关于SSL-ZYC 1615 Frogger的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!