zoj 1648 Circuit Board (判断线段是否相交)
来源:互联网 发布:mac seesheer试色 编辑:程序博客网 时间:2024/05/21 14:14
学习了算法导论上的线段相交的这部分!
正式进入计算几何的学习阶段~~~~~~
两条线段相交当且仅当下面两个条件至少成立一个:
1、每条线段都跨越了包含另一条线段的直线。
2、一条线段的某个端点落在另一条线段上。(这一情况来自与边界情况)
#include<cstdio>#include<iostream>#include<cstring>#define maxn 2010using namespace std;struct Point{ double x,y;}point[maxn<<1];struct node{ Point a,b;}seg[maxn];double direction(Point a,Point b,Point c){ double c1,c2,c3,c4; c1 = c.x-a.x; c2 = c.y-a.y; c3 = b.x-a.x; c4 = b.y-a.y; return (c1*c4-c2*c3);}bool onsegment(Point a,Point b,Point c){ if(c.x<=max(a.x,b.x) && c.x>=min(a.x,b.x) && c.y<=max(a.y,b.y)&& c.y>=min(a.y,b.y)) return true; else return false;}bool segintersect(int i,int j){ Point a = seg[i].a; Point b = seg[i].b; Point c = seg[j].a; Point d = seg[j].b; double d1,d2,d3,d4; d1 = direction(a,b,c); d2 = direction(a,b,d); d3 = direction(c,d,a); d4 = direction(c,d,b); if(d1*d2<0 && d3*d4<0) return true; else if(d1==0 && onsegment(a,b,c)) return true; else if(d2==0 && onsegment(a,b,d)) return true; else if(d3==0 && onsegment(c,d,a)) return true; else if(d4==0 && onsegment(c,d,b)) return true; else return false;}int main(){ int n; while(scanf("%d",&n)!=EOF) { int c = 0; for(int i=0;i<n;i++) { scanf("%lf%lf%lf%lf",&point[c].x,&point[c++].y,&point[c].x,&point[c].y); seg[i].a = point[c-1]; seg[i].b = point[c]; c++; } int flag = 0; for(int i=0;i<n && !flag;i++) { for(int j=i+1;j<n;j++) { if(segintersect(i,j)) { flag = 1; break; } } } if(!flag) puts("ok!"); else puts("burned!"); } return 0;}
0 0
- zoj 1648 Circuit Board (判断线段是否相交)
- ZOJ 1648 Circuit Board(判断线段相交)
- ZOJ 1648:Circuit Board __判断两线段相交
- ZOJ 1648 Circuit Board【跨立实验判断线段相交】
- ZOJ 1648 Circuit Board(线段相交判定)
- ZOJ 1648 Circuit Board(线段相交判定 刘汝佳模板)
- Circuit Board(zju1648,判断线段相交)
- Circuit Board(线段相交)
- ZOJ1648-Circuit Board(判断两直线是否相交)
- zoj 1648 Circuit Board
- zoj 1648 Circuit Board
- zoj 1648 Circuit Board
- zoj 1648 Circuit Board
- ZOJ 1648Circuit Board
- zoj 1648 Grandpa's Estate(判断线段是否相交(不考虑端点相交))
- ZOJ 1648 Circuit Board(计算几何)
- ZOJ--1648:Circuit Board(跨立实验线段判交)
- 判断线段是否相交
- ACM中的C++
- poj2456Aggressive cows(二分+贪心)
- php 二分查找法算法详解
- HDU 2955
- iOS 监听textfield的输入
- zoj 1648 Circuit Board (判断线段是否相交)
- Activity的生命周期
- 【ZOJ】2539 Energy Minimization 最小割——项目分配问题
- C语言数据类型与变量
- HDU 4883 TIANKENG’s restaurant (贪心)
- LeetCode第四题,Add Two Numbers
- 51Talk-Level 7 Unit 1 L4
- 114_fragment界面切换
- URAL 1934 Black Spot --- 简单最短路变形