您的位置:首页 > 其它

POJ 1066 计算几何 线段相交

2013-01-10 22:40 393 查看
题意:

求从目标点走矩形框至少要穿越多少条边。

题解:

从矩形框上穿出等价于从直线与矩形框的顶点穿出。

矩形框四个角特判!

View Code

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>

#define N 10000
#define EPS 1e-8

using namespace std;

struct LI
{
double x,y;
}li
[2],mi,co;

int n,ans;

inline void read()
{
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf%lf",&li[i][0].x,&li[i][0].y,&li[i][1].x,&li[i][1].y);
scanf("%lf%lf",&mi.x,&mi.y);
}

inline double cross(const LI &o,const LI &a,const LI &b)
{
double fx=a.x-o.x,fy=a.y-o.y,px=b.x-o.x,py=b.y-o.y;
return fx*py-fy*px;
}

inline int judge(const LI &a1,const LI &a2,const LI &b1,const LI &b2)
{
double fg1=cross(a1,a2,b1)*cross(a1,a2,b2);
double fg2=cross(b1,b2,a1)*cross(b1,b2,a2);
if(fg1<EPS&&fg2<EPS) return 1;
return false;
}

inline int check(int x,int p)
{
int num=0;
for(int i=1;i<=n;i++)
num+=judge(mi,li[x][p],li[i][0],li[i][1]);
return num;
}

inline void prp()
{
int num;
num=1;
co.x=co.y=0.0;
for(int i=1;i<=n;i++)
num+=judge(mi,co,li[i][0],li[i][1]);
ans=min(ans,num);

num=1;
co.x=co.y=100.0;
for(int i=1;i<=n;i++)
num+=judge(mi,co,li[i][0],li[i][1]);
ans=min(ans,num);

num=1;
co.x=0.0;co.y=100.0;
for(int i=1;i<=n;i++)
num+=judge(mi,co,li[i][0],li[i][1]);
ans=min(ans,num);

num=1;
co.x=100.0;co.y=0.0;
for(int i=1;i<=n;i++)
num+=judge(mi,co,li[i][0],li[i][1]);
ans=min(ans,num);
}

inline void go()
{
ans=0x3f3f3f3f;
for(int i=1;i<=n;i++)
for(int j=0;j<=1;j++)
ans=min(ans,check(i,j));
prp();
printf("Number of doors = %d\n",ans);
}

int main()
{
while(scanf("%d",&n)!=EOF) read(),go();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: