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