POJ 2253 Frogger

本文详细解析了青蛙从一个石头跳到另一个石头的问题,并提供了两种不同的算法实现:Floyd算法和Dijkstra算法。通过这两种算法,可以求得青蛙跳跃过程中需要的最大跳跃距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:http://poj.org/problem?id=2253

解题思路:

参考:http://www.cnblogs.com/freezhan/p/3238967.html

题目求的是青蛙从一个石头跳到另一个石头,它最大的一步只需要多大。

实现代码:

注意:用G++提交没有通过,c++过了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn=205;
struct Point{
    double x,y;
}p[maxn];

double w[maxn][maxn];

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

void floyd(int n){
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                w[i][j]=min(w[i][j],max(w[i][k],w[k][j]));
}

void init(int n){
    for(int i=1;i<=n;i++){
        w[i][i]=0;
        for(int j=i+1;j<=n;j++)
            w[i][j]=w[j][i]=dist(p[i],p[j]);
    }
}

int main(){
    int n;
    int t=0;
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }


        init(n);
        floyd(n);
        printf("Scenario #%d\n", ++t);
        printf("Frog Distance = %.3lf\n\n", w[1][2]);

    }
}

 Dijkstra方法:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;

const int V=205;
const double INF=99999999999;
struct Point{
    double x,y;
}p[V];

struct NodeHeap{
    int d,u;
    NodeHeap(int _d,int _u){
        d=_d;
        u=_u;
    }
    bool operator <(const NodeHeap &rhs)const{
        return d>rhs.d;
    }
};

double w[V][V],dis[V];
int vis[V];
double dist(Point a,Point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

void init(int n){
    for(int i=1;i<=n;i++){
        w[i][i]=0;
        for(int j=i+1;j<=n;j++){
            w[i][j]=dist(p[i],p[j]);
            w[j][i]=w[i][j];
        }
    }
}


double Dijkstra(int n){
    init(n);
    double ans=0;
    for(int i=0;i<=n;i++){
        dis[i]=INF;
        vis[i]=0;
    }

    priority_queue<NodeHeap> pq;
    pq.push(NodeHeap(0,1));
      dis[1]=0;
    vis[1]=1;

    while(!pq.empty()){
        NodeHeap x=pq.top();
        pq.pop();
        int u=x.u;
        vis[u]=1;
        if(ans<dis[u]&&dis[u]!=INF){
            ans=dis[u];
        }

        if(u==2) return ans;

        for(int i=1;i<=n;i++){
            if(!vis[i]){
                dis[i]=min(dis[i],w[i][u]);
                pq.push(NodeHeap(dis[i],i));
            }
        }

    }
     return ans;
}

int main(){
    int k=0;
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        printf("Scenario #%d\n",++k);
        printf("Frog Distance = %.3f\n\n",Dijkstra(n));

    }
    return 0;
}

 

转载于:https://www.cnblogs.com/IKnowYou0/p/6480335.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值