程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 2253&zoj 1942

poj 2253&zoj 1942

編輯:C++入門知識

Frogger
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 20716   Accepted: 6741

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這是一道變式的floyd,其實只要找到遞推公式,就非常的簡單。這個題目筆者很快就找到了遞推的公式,但坑爹的是筆者在存儲上搞錯了,我用了兩個數組來存儲x,y的坐標,但其實用個結構體就搞定了,結果就為這個小錯誤,wa了半天,還是不太靈活啊!下面是代碼:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const int maxn=300;
struct node{
    double x;
    double y;
};
node edge[maxn];
double w[maxn][maxn];
int n;
double juli(node a,node b){
         return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));//求距離的公式
}
void floyd(){
     for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
           for(int j=0;j<n;j++){
               w[i][j]=min(w[i][j],max(w[i][k],w[k][j]));//關鍵的遞推公式
             }
}

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved