枚举每个点对~~判断两个之间的直线距离有无被线段给隔断(两次差乘判断)...再Floyd就O了...纯粹来保持手感~~但也很囧了...首先是一些地方太大意~~打错了~~~再一个就是不知为毛G++就是过不了~~我看了好久都没问题~~用C++交就过了~~囧爆了...
Program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define ex 0.0000000001
#define oo 2000000000
using namespace std;
struct node1
{
double x,y;
}point[102];
struct node2
{
node1 p1,p2;
}line[102];
int t,m,n;
double dis[102][102];
bool have(node1 a,node1 b,node2 h)
{
double x1,y1,x2,y2,p;
int d1,d2;
x1=a.x-b.x; y1=a.y-b.y;
x2=a.x-h.p1.x; y2=a.y-h.p1.y;
p=x1*y2-x2*y1;
if (fabs(p)<ex) return false;
if (p>-ex) d1=1;
else d1=-1;
x2=a.x-h.p2.x; y2=a.y-h.p2.y;
p=x1*y2-x2*y1;
if (fabs(p)<ex) return false;
if (p>-ex) d2=1;
else d2=-1;
if (d1*d2==1) return false;
x1=h.p1.x-h.p2.x; y1=h.p1.y-h.p2.y;
x2=h.p1.x-a.x; y2=h.p1.y-a.y;
p=x1*y2-x2*y1;
if (fabs(p)<ex) return false;
if (p>-ex) d1=1;
else d1=-1;
x2=h.p1.x-b.x; y2=h.p1.y-b.y;
p=x1*y2-x2*y1;
if (fabs(p)<ex) return false;
if (p>-ex) d2=1;
else d2=-1;
if (d1*d2==1) return false;
return true;
}
double len(node1 a,node1 b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
int i,j,k;
point[1].x=0; point[1].y=5;
point[2].x=10; point[2].y=5;
while (~scanf("%d",&t))
{
if (t==-1) break;
n=2; m=0;
while (t--)
{
n++;
scanf("%lf%lf",&point[n].x,&point[n].y);
m++;
line[m].p1=point[n]; line[m].p1.y=0; line[m].p2=point[n];
n++; point[n].x=point[n-1].x;
scanf("%lf",&point[n].y);
n++; point[n].x=point[n-1].x;
scanf("%lf",&point[n].y);
m++;
line[m].p1=point[n-1]; line[m].p2=point[n];
n++; point[n].x=point[n-1].x;
scanf("%lf",&point[n].y);
m++;
line[m].p1=point[n]; line[m].p2=point[n]; line[m].p2.y=10;
}
for (i=1;i<=n;i++) dis[i][i]=0;
for (i=1;i<=n;i++)
for (j=1;j<i;j++)
{
dis[i][j]=dis[j][i]=oo;
for (k=1;k<=m;k++)
if (have(point[i],point[j],line[k])) goto A;
dis[i][j]=dis[j][i]=len(point[i],point[j]);
A: ;
}
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
printf("%.2lf\n",dis[1][2]);
}
return 0;
}