poj 1556 The Doors 最短路
来源:互联网 发布:吉他谱编配软件 编辑:程序博客网 时间:2024/04/30 05:23
很水的一题,但是改了好久都没改对。
原因是被定式思维害了,以为判断直线与点的位置只要返回个符号所以用int,但没想到负的double很小的时候变成int会成0,即丢失了原有符号。一直看了好几个小时才看出来。还是不够细致,这几天有点分心了。
/*author:jxylang:C/C++university:China,Xidian University**If you need to reprint,please indicate the source***/#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <queue>#define INF 1E9using namespace std;struct node{ double x,y; node(double a,double b) { x=a;y=b; } node(){}};double dx[20],dy[20][4];double dis[80][80]={0};node pp[80];int n,cnt;double d(node a,node b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double p(node a,node b,double x,double y)//小于0,点c在直线ab下,反之上方{ return (b.x-a.x)*(y-a.y)-(x-a.x)*(b.y-a.y);}bool isok(node a,node b){ int i,j; for(i=0;i<n&&dx[i]<=a.x;i++); bool flag=1; for(;i<n&&dx[i]<b.x;i++) { flag=0; for(j=0;j<4;j+=2) if(p(a,b,dx[i],dy[i][j])*p(a,b,dx[i],dy[i][j+1])<=0){flag=1;break;} if(!flag)return 0; } return 1;}bool input(){ scanf("%d",&n); if(n==-1)return 0; int i,j; cnt=0; pp[cnt++]=node(0,5); for(i=0;i<n;i++) { scanf("%lf",&dx[i]); for(j=0;j<4;j++) { scanf("%lf",&dy[i][j]); pp[cnt++]=node(dx[i],dy[i][j]); } } pp[cnt++]=node(10,5); for(i=0;i<cnt;i++) { for(j=i;j<cnt;j++) { dis[i][j]=dis[j][i]=INF; if(pp[i].x==pp[j].x)continue; if(!isok(pp[i],pp[j]))continue; dis[i][j]=dis[j][i]=d(pp[i],pp[j]); // cout<<i<<" "<<j<<" "<<dis[i][j]<<endl; } } return 1;}double dd[80];bool inq[80];double solve(){ int u,v; memset(dd,127,sizeof(dd)); memset(inq,0,sizeof(inq)); queue<int> q;q.push(0); dd[0]=0; double t; while(!q.empty()) { v=q.front();q.pop(); inq[v]=0; for(u=0;u<cnt;u++) if(dd[u]>(t=dd[v]+dis[v][u])) { dd[u]=t; if(inq[u])continue; q.push(u);inq[u]=1; } } return dd[cnt-1];}int main(){ while(input()) printf("%.2f\n",solve());}
- poj 1556 The Doors 最短路
- poj 1556 The Doors (建图+最短路)
- POJ 1556 The Doors(几何+最短路)
- POJ 1556 The Doors --几何,最短路
- poj 1556 The Doors(几何+最短路)
- poj 1556 The Doors(最短路+几何)
- poj 1556 The Doors(最短路+判断线段相交)
- poj 1556 The Doors(最短路+判断线段相交)
- poj 1556 The Doors(线段相交+最短路)
- POJ 1556 The Doors (计算几何+dij最短路)
- POJ 1556 The Doors 计算几何+ 最短路
- POJ 1556 The Doors(判断线段相交 + 最短路)
- poj 1556 The Doors 线段相交,最短路
- 【POJ】1556 The Doors 最短路+判断线段相交
- POJ 1556 The Doors 判断线段相交+最短路
- POJ 1556 The Doors(计算几何+最短路)
- POJ 1556 The Doors(判断线段相交 && 最短路)
- poj 1556 The Doors(线段交+最短路)
- Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!
- 升级ADT到21.1后,编译工程不能生成R.java文件
- 虚拟化VMware简介5——DRS 与 DPM 详解
- ViewPager中加载Activity页面
- [Leetcode] Word Ladder
- poj 1556 The Doors 最短路
- POJ 1942 Paths on a Grid
- 【最小生成树】hdu 1863 畅通工程
- 徐州人特点吧(转载)
- 怎样区别桃花、杏花、梨花、樱花、梅花、李花
- 专访蒋彪:JavaEE是企业级开发首选(转载)
- QT210 自制bootloader实现uboot command 和串口烧写bootloader
- hdu - 1042 - N!(高精度计算)
- Epic Games创始人Tim Sweeney:头戴显示技术将颠覆电子产业