Monday, April 25, 2011

10610 - Gopher and Hawks


#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
#define M 1005
#define E 0.00000001
using namespace std;

struct Hole
{
    double x,y;
};
struct Hole H[M];
bool IsAdjacent(Hole,Hole,double);
int BFS(Hole,Hole,double);
int N;

int main()
{
    int v,m,n,l;
    double dis;
    char inp[100];

    //freopen("in.txt","r",stdin);
    while(scanf("%d%d\n",&v,&m)&&(m+v))
    {
        N=0,dis=60.0*v*m;

        while(gets(inp))
        {
            for(l=0;inp[l];l++);
            if(!l)break;
            sscanf(inp,"%lf%lf",&H[N].x,&H[N].y);
            N++;
        }

        n = BFS(H[0],H[1],dis);
        if(n>=0)
            printf("Yes, visiting %d other holes.\n",n);
        else
            printf("No.\n");
    }
    return 0;
}

bool IsAdjacent(Hole h1,Hole h2,double dis)
{
    double d,x,y;
    x=h1.x-h2.x;
    y=h1.y-h2.y;
    d=sqrt(x*x+y*y);

    if(d+E>dis)return false;
    return true;
}

int BFS(Hole hs,Hole hd,double dis)
{
    int h,i,color[M],d[M];
    queue<int>Q;
    memset(color,0,sizeof(color));

    color[0]=1,d[0]=0;
    Q.push(0);

    while(!Q.empty())
    {
        h=Q.front();Q.pop();
        for(i=0;i<N;i++)
        {
            if(color[i]==0&&IsAdjacent(H[h],H[i],dis))
            {
                color[i]=1;
                d[i]=d[h]+1;
                if(H[i].x==hd.x &&H[i].y ==hd.y)return d[h];
                Q.push(i);
            }
        }
    }
    return -1;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.