4 10 17 0 27 0 37 0 45 0 1 10 20 30
42.50 5 can‘t be saved题意:有个100*100的正方形池溏,中心以坐标(0,0)表示的二维坐标,中心有一块土地以(0,0)为中心的圆,直径为15,池溏有n条鳄鱼,坐标位置给出。现在有一个人在池中心的土地上,要逃到岸上去,可以踩着鳄鱼过去,最远只能跳 d 米,问最短的路且最少跳了几下。如果不能到达陆地,则输出can‘t be saved分析:n条鲤鱼看成点,人的起始一个点,还有一个就是目的地(陆地)是一个点。共n+2个点;#include<stdio.h> #include<math.h> #include<queue> using namespace std; const int N = 105; const double inf = 0x3ffffffff; int n,step[N],x[N],y[N]; double dis[N],mapt[N][N],d; int ABS(int a) { return a<0?-a:a; } void init() { for(int i=1;i<n;i++) { mapt[0][i]=mapt[i][0]=sqrt(x[i]*x[i]+y[i]*y[i]*1.0)-7.5; if(mapt[0][i]>d) mapt[0][i]=mapt[i][0]=inf; double tx=ABS(x[i]),ty=ABS(y[i]); if(tx<ty)tx=ty; if(50.0-tx<=d) mapt[n][i]=mapt[i][n]=50.0-tx; else mapt[n][i]=mapt[i][n]=inf; } if(d>=50-7.5) mapt[0][n]=mapt[n][0]=50-7.5; else mapt[0][n]=mapt[n][0]=inf; for(int i=1;i<n;i++) for(int j=1;j<n;j++) { mapt[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); if(mapt[i][j]>d) mapt[i][j]=inf; } for(int i=0;i<=n;i++) dis[i]=inf,step[i]=99999999; } void spfa() { int inq[N]={0},s; queue<int>q; dis[0]=0; step[0]=0; q.push(0); while(!q.empty()) { s=q.front(); q.pop(); inq[s]=0; for(int i=1;i<=n;i++) if(mapt[s][i]!=inf) { if(dis[i]>dis[s]+mapt[s][i]) { step[i]=step[s]+1; dis[i]=dis[s]+mapt[s][i]; if(inq[i]==0) q.push(i),inq[i]=1; } else if(dis[i]==dis[s]+mapt[s][i]&&step[i]>step[s]+1) { step[i]=step[s]+1; if(inq[i]==0) q.push(i),inq[i]=1; } } } } int main() { while(scanf("%d%lf",&n,&d)>0) { x[0]=y[0]=0; n++; for(int i=1;i<n;i++) scanf("%d%d",&x[i],&y[i]); init(); spfa(); if(dis[n]==inf) printf("can't be saved\n"); else printf("%.2lf %d\n",dis[n],step[n]); } }
HDU1245 Saving James Bond(最短路+简单几何)
原文地址:http://blog.csdn.net/u010372095/article/details/44727135