zoukankan      html  css  js  c++  java
  • 【POJ

    -->Frogger

     中文翻译

    Descriptions:

    湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距离。你的工作是计算Alice和Bob石头之间的青蛙距离。

    Input

    多实例输入 
    先输入一个整数n表示石头数量,当n等于0时结束。
    接下来2-n+1行依次给出编号为1到n的石头的坐标xi , yi。
    2 <= n <= 200 
    0 <= xi , yi <= 1000

    Output

    先输出"Scenario #x", x代表样例序号。
    接下来一行输出"Frog Distance = y", y代表你得到的答案。 
    每个样例后输出一个空行。
    (ps:wa有可能是精度问题,g++不对可以用c++尝试,都不对就是代码问题)

    Sample Input

    2
    0 0
    3 4
    
    3
    17 4
    19 4
    18 5
    
    0
    

    Sample Output

    Scenario #1
    Frog Distance = 5.000
    
    Scenario #2
    Frog Distance = 1.414

    题目链接:
    https://vjudge.net/problem/POJ-2253

    我也是第一次做这样的题,用到一个算法

    Floyd算法求出两两最短路,再求出从每个点开始的最长路,最后从这n个最长路中求出最小的那个即为所求。

    Floyd算法

     https://www.cnblogs.com/sky-stars/p/11204139.html

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #define mod 1000000007
    #define eps 1e-6
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MEM(x,y) memset(x,y,sizeof(x))
    #define Maxn 205
    using namespace std;
    struct node
    {
        double x,y;
    };
    node points[Maxn];
    double path[Maxn][Maxn];//两点间的权值
    int cases=1;
    int n;
    //Floyd算法
    void floyd()
    {
        for(int k=1; k<=n; k++)
            //主要针对由i到j的松弛,最终任意两点间的权值都会被分别松弛为最大跳的最小(但每个两点的最小不一定相同)
            for(int i=1; i<=n-1; i++)
                for(int j=i+1; j<=n; j++)
                    //当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线
                    if(path[i][k]<path[i][j]&&path[k][j]<path[i][j])
                        //当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通
                        if(path[i][k]<path[k][j])
                            path[i][j]=path[j][i]=path[k][j];
                        else
                            path[i][j]=path[j][i]=path[i][k];
    }
    int main()
    {
        while(cin>>n,n)
        {
            for(int i=1; i<=n; i++)
                cin>>points[i].x>>points[i].y;
            for(int i=1; i<=n-1; i++)
                for(int j=i+1; j<=n; j++)
                {
                    //两点间的距离
                    double tx=points[j].x-points[i].x;
                    double ty=points[j].y-points[i].y;
                    path[i][j]=path[j][i]=sqrt(tx*tx+ty*ty);//双向性
                }
    
            floyd();
            cout<<"Scenario #"<<cases++<<endl;
            printf("Frog Distance = %.3lf
    
    ",path[1][2]);
        }
    }
  • 相关阅读:
    119. Pascal's Triangle II
    118. Pascal's Triangle
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    108. Convert Sorted Array to Binary Search Tree
    88. Merge Sorted Array
    83. Remove Duplicates from Sorted List
    70. Climbing Stairs
    陌陌面试经历
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11204110.html
Copyright © 2011-2022 走看看