博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Noi2011 : 智能车比赛
阅读量:6838 次
发布时间:2019-06-26

本文共 3537 字,大约阅读时间需要 11 分钟。

假设S在T左边,那么只能往右或者上下走

f[i]表示S到i点的最短路

f[i]=min(f[j]+dis(i,j)(i能看到j))

判断i能看到j就维护一个上凸壳和一个下凸壳

时间复杂度$O(n^2)$

 

代码写的有点长…

 

#include
#include
#include
#define N 2010using namespace std;struct P{int x,y;P(){}P(int _x,int _y){x=_x,y=_y;}P operator-(const P&a){return P(x-a.x,y-a.y);}};inline int cross(P a,P b){return a.x*b.y-a.y*b.x;}inline double dis(P a,P b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int n,i,X1[N],Y1[N],X2[N],Y2[N],xs,ys,xt,yt,st,en;double v,f[N][4],ans,inf=1e9;inline void call(int x,int y,int p,double&t){ t=inf; P o(x,y),up(x,y+1),down(x,y-1),tmp; for(int i=p-1;i>st;i--){ tmp=P(X2[i],Y2[i]); if(cross(up-o,tmp-o)>=0){//在up下边或者重合 up=tmp; if(cross(down-o,tmp-o)<=0)t=min(t,f[i][3]+dis(o,tmp));//在down上边或者重合 } tmp=P(X2[i],Y1[i]); if(cross(down-o,tmp-o)<=0){//在down上边或者重合 down=tmp; if(cross(up-o,tmp-o)>=0)t=min(t,f[i][2]+dis(o,tmp));//在up下边或者重合 } tmp=P(X1[i],Y2[i]); if(cross(up-o,tmp-o)>=0){//在up下边或者重合 up=tmp; if(cross(down-o,tmp-o)<=0)t=min(t,f[i][1]+dis(o,tmp));//在down上边或者重合 } tmp=P(X1[i],Y1[i]); if(cross(down-o,tmp-o)<=0){//在down上边或者重合 down=tmp; if(cross(up-o,tmp-o)>=0)t=min(t,f[i][0]+dis(o,tmp));//在up下边或者重合 } } tmp=P(X2[st],Y2[st]); if(cross(up-o,tmp-o)>=0){//在up下边或者重合 up=tmp; if(cross(down-o,tmp-o)<=0)t=min(t,f[st][3]+dis(o,tmp));//在down上边或者重合 } tmp=P(X2[st],Y1[st]); if(cross(down-o,tmp-o)<=0){//在down上边或者重合 down=tmp; if(cross(up-o,tmp-o)>=0)t=min(t,f[st][2]+dis(o,tmp));//在up下边或者重合 } tmp=P(xs,ys); if(cross(up-o,tmp-o)>=0&&cross(down-o,tmp-o)<=0)t=dis(o,tmp);//在up下边或者重合 在down上边或者重合}inline void calr(int x,int y,int p,double&t){ t=inf; P o(x,y),up(x,y+1),down(x,y-1),tmp; tmp=P(X1[p],Y2[p]); if(cross(up-o,tmp-o)>=0){//在up下边或者重合 up=tmp; if(cross(down-o,tmp-o)<=0)t=min(t,f[p][1]+dis(o,tmp));//在down上边或者重合 } tmp=P(X1[p],Y1[p]); if(cross(down-o,tmp-o)<=0){//在down上边或者重合 down=tmp; if(cross(up-o,tmp-o)>=0)t=min(t,f[p][0]+dis(o,tmp));//在up下边或者重合 } for(int i=p-1;i>st;i--){ tmp=P(X2[i],Y2[i]); if(cross(up-o,tmp-o)>=0){//在up下边或者重合 up=tmp; if(cross(down-o,tmp-o)<=0)t=min(t,f[i][3]+dis(o,tmp));//在down上边或者重合 } tmp=P(X2[i],Y1[i]); if(cross(down-o,tmp-o)<=0){//在down上边或者重合 down=tmp; if(cross(up-o,tmp-o)>=0)t=min(t,f[i][2]+dis(o,tmp));//在up下边或者重合 } tmp=P(X1[i],Y2[i]); if(cross(up-o,tmp-o)>=0){//在up下边或者重合 up=tmp; if(cross(down-o,tmp-o)<=0)t=min(t,f[i][1]+dis(o,tmp));//在down上边或者重合 } tmp=P(X1[i],Y1[i]); if(cross(down-o,tmp-o)<=0){//在down上边或者重合 down=tmp; if(cross(up-o,tmp-o)>=0)t=min(t,f[i][0]+dis(o,tmp));//在up下边或者重合 } } tmp=P(X2[st],Y2[st]); if(cross(up-o,tmp-o)>=0){//在up下边或者重合 up=tmp; if(cross(down-o,tmp-o)<=0)t=min(t,f[st][3]+dis(o,tmp));//在down上边或者重合 } tmp=P(X2[st],Y1[st]); if(cross(down-o,tmp-o)<=0){//在down上边或者重合 down=tmp; if(cross(up-o,tmp-o)>=0)t=min(t,f[st][2]+dis(o,tmp));//在up下边或者重合 } tmp=P(xs,ys); if(cross(up-o,tmp-o)>=0&&cross(down-o,tmp-o)<=0)t=dis(o,tmp);//在up下边或者重合 在down上边或者重合}int main(){ scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d%d%d%d",&X1[i],&Y1[i],&X2[i],&Y2[i]); scanf("%d%d%d%d",&xs,&ys,&xt,&yt); if(xs>xt)swap(xs,xt),swap(ys,yt); scanf("%lf",&v); for(i=1;i<=n;i++)if(X1[i]<=xs&&xs<=X2[i]&&Y1[i]<=ys&&ys<=Y2[i]){st=i;break;} for(i=n;i;i--)if(X1[i]<=xt&&xt<=X2[i]&&Y1[i]<=yt&&yt<=Y2[i]){en=i;break;} f[st][2]=dis(P(xs,ys),P(X2[st],Y1[st])); f[st][3]=dis(P(xs,ys),P(X2[st],Y2[st])); for(i=st+1;i

  

 

转载地址:http://cwqkl.baihongyu.com/

你可能感兴趣的文章
21.5. 流量控制
查看>>
WSRP调用中的一些问题
查看>>
Android 正则表达式
查看>>
5.22. Spring boot with Cache
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]4.3.13
查看>>
string Join
查看>>
布线须知:机柜在数据中心机房的三个新用途
查看>>
迁移到云:渐进但不可逆转
查看>>
Patchwork间谍组织将目标扩大至政府
查看>>
工业物联网为“两化融合”带来巨大推力
查看>>
《UNIXLinux程序设计教程》一3.7 非阻塞I/O
查看>>
IBM遭标普下调评级
查看>>
手机短信验证码真的安全吗?
查看>>
关于智慧城市建设的几点建议
查看>>
Facebook高管:我们是科技公司 不是媒体公司
查看>>
《领域特定语言》一2.3DSL的问题
查看>>
TensorFlow 1.0 正式发布 你需要知道的都在这里
查看>>
空调能窃听插座能放火?物联网成了“危”联网
查看>>
视频监控日常使用存在哪些故障
查看>>
半导体并购停不下来 ADI拟148亿美元收购Linear
查看>>