题目:已知地鼠的从一个洞要到另一个洞,中间还有其他的洞。地鼠每次移动的最大时间和速度有限制,
问是否存在一条路径,使得经过的其他洞最少,从起始点到达目标点。
分析:最短路,搜索。直接利用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;
}