uva 754 Treasure Hunt?! (线段位置判断并且求交点)
来源:互联网 发布:淘宝自拍技巧 编辑:程序博客网 时间:2024/04/29 15:16
只需要枚举每个起点与终点之间有条线段与它相交。
代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #define MAXN 1000 #define ESP 1e-8 using namespace std; struct point { double x,y; point(): x(.0), y(.0) {}; point(double _x,double _y) : x(_x),y(_y) {}; void input() { scanf("%lf %lf",&x,&y); } }; struct line { point a,b; }; double sgn(double d) { return d > ESP ? 1 : (d < -ESP ? -1 : 0); } point operator-(const point a,const point b) { return point(b.x-a.x , b.y-a.y); } double operator*(const point a,const point b) { return a.x*b.y - a.y*b.x; } bool operator==(const point a,const point b) { return sgn(a.x-b.x) == 0 && sgn(a.y-b.y) == 0; } bool jiaodian(point a,point b,point c,point d,point &p) { double s1 = (b-a) * (c-a) , s2 = (b-a) * (d-a), s3 = (d-c) * (a-c) , s4 = (d-c) * (b-c); if( sgn(s1) * sgn(s2) > 0 || sgn(s3) * sgn(s4) > 0) return false; p = point( (s2*c.x - s1*d.x) / (s2-s1), (s2*c.y - s1*d.y) / (s2-s1) ); return true; } bool pan(point a,point b,point c,point d) { double s1 = (b-a) * (c-a) , s2 = (b-a) * (d-a), s3 = (d-c) * (a-c) , s4 = (d-c) * (b-c); if( sgn(s1) * sgn(s2) >= 0 || sgn(s3) * sgn(s4) >= 0) return false; return true; } line ab[MAXN]; point d[MAXN],s; int dn,n; int max(int a, int b) { return a>b?a:b; } int min(int a, int b) { return a<b?a:b; } bool cmp(const point &a, const point &b) { if( sgn(a.x-b.x) != 0 ) { if( sgn(a.x-b.x) < 0 ) return true; else return false; } else { if( sgn(a.y-b.y) < 0) return true; else return false; } } int get(point a,point b) { int i,j,k = 0; point c; for(i=1;i<=n;i++) if(pan(a, b, ab[i].a, ab[i].b)) k++; return k; } int add(point a,point b) { int i,j,k,r,w,ans; point c; dn = 0; d[++dn] = a; d[++dn] = b; for(i=1;i<=n;i++) { if( jiaodian(a, b, ab[i].a, ab[i].b, c) ) d[++dn] = c; } sort(d+1,d+dn+1,cmp); // for(i=1;i<=dn;i++) // printf("%f %f \n",d[i].x,d[i].y); ans = 1e8; for(i=2;i<=dn;i++) { k = get(s, point( (d[i-1].x+d[i].x)/2, (d[i-1].y+d[i].y)/2 ) ) ; //printf("%f %f %d\n",(d[i-1].x+d[i].x)/2, (d[i-1].y+d[i].y)/2,k); ans = min(ans, k); } return ans; } void init() { int i,j,k,r,w; //scanf("%d",&n); for(i=1;i<=n;i++) { ab[i].a.input(); ab[i].b.input(); } s.input(); } void solve() { int ans = 1e8; ans = min(ans, add(point(0,0), point(0,100))); ans = min(ans, add(point(0,100), point(100,100))); ans = min(ans, add(point(100,100), point(100,0))); ans = min(ans, add(point(0,0), point(100,0))); printf("Number of doors = %d\n",ans+1); } int main() { int t,i; //scanf("%d",&t); //for(i=1;i<=t;i++) while(scanf("%d",&n) != EOF) { init(); solve(); } return 0; }
- uva 754 Treasure Hunt?! (线段位置判断并且求交点)
- POJ 1066 Treasure Hunt 判断线段相交(求交点个数)
- POJ 1066 Treasure Hunt(浮点判断线段交点)
- 计算几何 POJ 2826 An Easy Problem?! (线段位置判断并且求交点)
- UVa 754 Treasure Hunt <计算几何(相交判断)>
- uva 754 - Treasure Hunt(几何)
- poj 1066 Treasure Hunt(判断线段相交)
- poj 1066 Treasure Hunt(判断线段相交)
- poj 1066 Treasure Hunt(判断线段相交)
- poj 1066 Treasure Hunt(判断线段相交)
- 1066 Treasure Hunt (判断线段相交)
- POJ 1066 Treasure Hunt(线段相交判断)
- POJ 1066 Treasure Hunt(线段相交判断)
- uva 303 pipe (求线段交点,判断线段相交)
- (beginer) 半平面交+bfs UVA 754 - Treasure Hunt
- POJ 1066 Treasure Hunt (线段相交)
- poj 1066 Treasure Hunt (线段交)
- poj1066—Treasure Hunt(线段相交)
- IE6的 z-index BUG
- ubuntu(内核2.6)解压rar文件
- TCP连接的建立(三次握手)和释放(四次握手)
- 读书笔记(第四讲)operator
- javascript:客户端的对象层次
- uva 754 Treasure Hunt?! (线段位置判断并且求交点)
- 跳跃表法实现case结构
- 较新的CSS HACK
- 汇编语言实现冒泡排序
- Android: Sensors on Android 2.3 - Gingerbread
- C#最小化到系统托盘实现
- unsigned char, unsigned int
- Centos 5.3 Nginx+php+mysql配置 独立的 Subversion (SVN)服务器
- SVN:自动更新linux 网站目录