zoj 1248 || poj 1474 Video Surveillance(判断多边形是否存在核)
2011-07-10 17:49
639 查看
判断一个多边形是否有核。
跟UVA10078不同的是,10078是判断是否存在一个点看不到另一个存在多边形的点,所以判断它是否为凸包就好了。而这个是判断多边形是否存在核。
开始想错了,用面积判断呢,WA了,看discuss说是用核的点的个数判断,如果个数为0那么就不存在核,恩,其实刚开始也有这么想,不过不太确定。。。还是对半平面交这个东东理解不好啊。。。所以上个代码改改就好了。。
跟UVA10078不同的是,10078是判断是否存在一个点看不到另一个存在多边形的点,所以判断它是否为凸包就好了。而这个是判断多边形是否存在核。
开始想错了,用面积判断呢,WA了,看discuss说是用核的点的个数判断,如果个数为0那么就不存在核,恩,其实刚开始也有这么想,不过不太确定。。。还是对半平面交这个东东理解不好啊。。。所以上个代码改改就好了。。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> using namespace std; const int MAX = 105; struct point{ double x,y;}; point p[MAX],s[MAX]; const double eps = 1e-6; bool dy(double x,double y) { return x > y + eps;} // x > y bool xy(double x,double y) { return x < y - eps;} // x < y bool dyd(double x,double y) { return x > y - eps;} // x >= y bool xyd(double x,double y) { return x < y + eps;} // x <= y bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向 { return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y); } point l2l_inst_p(point u1,point u2,point v1,point v2) { point ans = u1; double t = ((u1.x - v1.x)*(v1.y - v2.y) - (u1.y - v1.y)*(v1.x - v2.x))/ ((u1.x - u2.x)*(v1.y - v2.y) - (u1.y - u2.y)*(v1.x - v2.x)); ans.x += (u2.x - u1.x)*t; ans.y += (u2.y - u1.y)*t; return ans; } void inst_hp(point p[],int n,point s[],int &len) { point tp[MAX]; p = p[0]; for(int i=0; i<=n; i++) tp[i] = p[i]; int cp = n,tc; for(int i=0; i<n; i++) { tc = 0; for(int k=0; k<cp; k++) { if( dyd(crossProduct(p[i],p[i+1],tp[k]),0.0) )// 顺时针的话是dyd s[tc++] = tp[k]; if( xy(crossProduct(p[i],p[i+1],tp[k])* crossProduct(p[i],p[i+1],tp[k+1]),0.0) ) s[tc++] = l2l_inst_p(p[i],p[i+1],tp[k],tp[k+1]); } s[tc] = s[0]; for(int k=0; k<=tc; k++) tp[k] = s[k]; cp = tc; } len = cp; } int main() { int len,ncases,n,ind = 1; while( ~scanf("%d",&n) && n ) { for(int i=0; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y); inst_hp(p,n,s,len); printf("Floor #%d\n",ind++); if( len ) printf("Surveillance is possible.\n\n"); else printf("Surveillance is impossible.\n\n"); } return 0; }
相关文章推荐
- poj 2585,zoj 2193 Window Pains【拓扑排序思想判断图是否存在环】
- POJ 1474 Video Surveillance(判断多边形是否有核)
- POJ 3335 判断一个多边形是否存在核
- Video Surveillance - POJ 1474(判断是否存在内核)
- POJ 3335(半平面交—判断多边形的核是否存在)
- POJ 1584(计算几何初步——凸包判断,圆与多边形,点是否在多边形内)
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)
- POJ 1860(二次用floyd, 判断每一个点 ,是否存在正权回路)
- POJ 1474 Video Surveillance (多边形内核判断)
- POJ 1755 判断线性区域是否存在可行区域
- poj 1469 COURSES(判断是否是存在不匹配的点(对于右边的点集来说))
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)
- poj 3259 bellman-ford判断是否存在负权回路
- ZOJ1248/POJ1474/HDU1469 Video Surveillance(判断多边形是否存在核,计算几何)
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)
- zoj 1010 Area 判断线段是否相交(把线段扩充一倍后 好处理) + 多边形求面积
- POJ 1474 Video Surveillance 半平面交求多边形内核存在性
- 判断多边形的核是否存在 poj3130&&poj3335
- POJ 3259 Wormholes (Bellman-Ford/SPFA 判断是否存在负权环)