码迷,mamicode.com
首页 > 其他好文 > 详细

Frogger

时间:2014-07-26 14:26:01      阅读:323      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   java   color   使用   os   

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Description

Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of tourists‘ sunscreen, he wants to avoid swimming and instead reach her by jumping. 
Unfortunately Fiona‘s stone is out of his jump range. Therefore Freddy considers to use other stones as intermediate stops and reach her by a sequence of several small jumps. 
To execute a given sequence of jumps, a frog‘s jump range obviously must be at least as long as the longest jump occuring in the sequence. 
The frog distance (humans also call it minimax distance) between two stones therefore is defined as the minimum necessary jump range over all possible paths between the two stones. 

You are given the coordinates of Freddy‘s stone, Fiona‘s stone and all other stones in the lake. Your job is to compute the frog distance between Freddy‘s and Fiona‘s stone. 

Input

The input will contain one or more test cases. The first line of each test case will contain the number of stones n (2<=n<=200). The next n lines each contain two integers xi,yi (0 <= xi,yi <= 1000) representing the coordinates of stone #i. Stone #1 is Freddy‘s stone, stone #2 is Fiona‘s stone, the other n-2 stones are unoccupied. There‘s a blank line following each test case. Input is terminated by a value of zero (0) for n.

Output

For each test case, print a line saying "Scenario #x" and a line saying "Frog Distance = y" where x is replaced by the test case number (they are numbered from 1) and y is replaced by the appropriate real number, printed to three decimals. Put a blank line after each test case, even after the last one.

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

 

分析:

有N块石头,1—N。每块石头都有x,y坐标,青蛙一号站在第一块石头上,青蛙二号站在第二块石头上,青蛙一号想要通过这N块石头去找青蛙二号,因为青蛙一号可以踩在任何一块石头上,所以从第一块石头到第二块石头有很多条路径,假设为X,在每一条路径中,都有跳跃范围(即在这条路径中,两块石头之间的最大距离),那么一共有X个跳跃范围,我们要求的就是这X个跳跃范围的最小值,就是the frog distance。   比如有  有两条通路  1(4)5 (3)2 代表1到5之间的边为4,  5到2之间的边为3,那么该条通路跳跃范围(两块石头之间的最大距离)为 4,  另一条通路 1(6) 4(1) 2 ,该条通路的跳跃范围为6, 两条通路的跳跃范围分别是 4 ,6,我们要求的就是最小的那一个跳跃范围,即4.

边的遍历和点值的更新。这个点值代表的是,从1号石头到第[i]块石头的frog distance。 用floyed算法和dijkstra算法,把更新点值的语句改动一下就可以。

 

代码:

floyed:

#include<iostream>
#include<cmath>
#include<iomanip>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxNode=210;
double mp[maxNode][maxNode];
int nodeNum;

struct P
{
    int x,y;
}point[maxNode];

double dis(P a,P b)
{
    return sqrt((b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x));
}

void floyed()
{
    for(int k=1;k<=nodeNum;k++)
        for(int i=1;i<=nodeNum;i++)
            for(int j=1;j<=nodeNum;j++)
                mp[i][j]=min(mp[i][j],max(mp[i][k],mp[k][j]));//许多通路中最长边中的最小边
}

int main()
{
    int c=1;
    while(cin>>nodeNum&&nodeNum)
    {
        for(int i=1;i<=nodeNum;i++)
           cin>>point[i].x>>point[i].y;
        for(int i=1;i<=nodeNum;i++)
           for(int j=i+1;j<=nodeNum;j++)
           {
                  mp[i][j]=mp[j][i]=dis(point[i],point[j]);
           }
        floyed();
        cout<<"Scenario #"<<c++<<endl;
        cout<<setiosflags(ios::fixed)<<setprecision(3)<<"Frog Distance="<<mp[1][2]<<endl;
        /*cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2);
setiosflags 是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是执行由有参数指定
区域内的动作;

iso::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点
数,并且在允许的精度范围内尽可能的把数字移向小数点右侧;

setprecision 也是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是设定浮点数;
setprecision(2) 的意思就是小数点输出的精度,即是小数点右面的数字的个数为2。

iso::right 也是setiosflags 的参数,该参数的指定作用是在指定区域内右对齐输出;

cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2);
合在一起的意思就是,输出一个右对齐的小数点后两位的浮点数。

使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。
如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。
setiosflags(ios::fixed)是用定点方式表示实数
*/
        cout<<endl;
    }
    return 0;
}

 

dijkstra:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;
const int maxn=210;
const int inf=0x3f3f3f3f;
double mp[maxn][maxn];
double dist[maxn];
bool vis[maxn];
int n;

struct  P
{
    int x,y;
}point[maxn];

double dis(P a,P b)
{
    return sqrt((b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x));
}

void dijkstra(int start)
{
    memset(vis,0,sizeof(vis));
    //memset(dist,inf,sizeof(dist));
    for(int i=1;i<=n;i++)
        dist[i]=inf;
    dist[start]=0;
    for(int i=1;i<=n;i++)
    {
        int MinNum,Min=inf;
        for(int j=1;j<=n;j++)
            if(!vis[j]&&dist[j]<Min)
        {
            MinNum=j;
            Min=dist[j];
        }
        vis[MinNum]=1;
        for(int j=1;j<=n;j++)
            dist[j]=min(dist[j],max(dist[MinNum],mp[MinNum][j]));//dis[j]为从一号石头到第j号石头所有通路中最长边中的最小边
    }
}

int main()
{
    int c=1;
    while(cin>>n&&n)
    {
        for(int i=1;i<=n;i++)
            cin>>point[i].x>>point[i].y;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
            {
                mp[i][j]=mp[j][i]=dis(point[i],point[j]);
            }
        dijkstra(1);
        cout<<"Scenario #"<<c++<<endl;
        cout<<setiosflags(ios::fixed)<<setprecision(3)<<"Frog Distance = "<<dist[2]<<endl;
        cout<<endl;
    }
    return 0;
}

注意:  double 数组 就不要轻易用memset复制了,还得考虑字节长度。

 

Frogger,布布扣,bubuko.com

Frogger

标签:des   style   blog   http   java   color   使用   os   

原文地址:http://www.cnblogs.com/lipching/p/3869798.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!