UVa 10610 - Gopher and Hawks

题目:已知地鼠的从一个洞要到另一个洞,中间还有其他的洞。地鼠每次移动的最大时间和速度有限制,

            问是否存在一条路径,使得经过的其他洞最少,从起始点到达目标点。

分析:最短路,搜索。直接利用bfs搜索即可, 边的长度是平面距离,不超过最大时间*最大速度即可行。

说明:Uhunt挂了,╮(╯▽╰)╭

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;

typedef struct pnode
{
	double x,y;
	int    step;
}point;
point P[1010];
int   Q[1010];

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 bfs( int s, int t, int n, double p )
{
	if ( s == t )
		printf("Yes, visiting 0 other holes.\n");
	P[s].step = 0;P[t].step = 1001;
	Q[0] = s;
	int move = 0,save = 1;
	while ( move < save ) {
		int now = Q[move ++];
		for ( int i = 0 ; i < n ; ++ i ) {
			if ( now != i && dist(P[now], P[i]) <= p && P[now].step+1 < P[i].step ) {
				P[i].step = P[now].step+1;
				Q[save ++] = i;
				if ( i == t ) {
					printf("Yes, visiting %d other holes.\n",P[now].step);
					return;
				}
			}
		}
	}
	printf("No.\n");
}

int main()
{
	double v,m;
	char   ch; 
	while ( ~scanf("%lf%lf",&v,&m) && (m != 0||v != 0) ) {
		getchar();
		scanf("%lf%lf",&P[0].x,&P[0].y);
		getchar();
		scanf("%lf%lf",&P[1].x,&P[1].y);
		getchar();
		int count = 2;
		while ( 1 ) {
			if ( (ch = getchar()) == '\n' ) break;
			ungetc(ch,stdin);
			scanf("%lf%lf",&P[count].x,&P[count].y);
			P[count ++].step = 1001;
			getchar();
		}
		
		bfs( 0, 1, count, 60.0*v*m );
	}
	return 0;
}

你可能感兴趣的:(UVa 10610 - Gopher and Hawks)