UVA 10078 The Art Gallery

 

 

判断这个。。。死角??艺术画廊,经典题目啊。

 

《计算几何:C语言描述》上有说guard这个点怎么找,开始没怎么看题,以为还得用半平面交神马的,那个我还不会,这个只要判断是否存在死角就可以了。

 

凸包是必然不存在的,如果不是凸包,必然存在。想象一下,如果是凹的多边形,必然有两个顶点之间连线不在多边形内,那么必然存在这个点。

 

所以只需判断是否是凸包即可。这个还可以用叉积,只要判断边和前一条边的关系是按着一个方向转即可。

 

#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 = 55; struct point{ double x,y;}; point p[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); } bool is_convexhull(point p[],int n) { for(int i=0; i<n; i++) if( xy( crossProduct(p[i],p[(i+1)%n],p[(i+2)%n]) * crossProduct(p[(i+1)%n],p[(i+2)%n],p[(i+3)%n]),0.0) ) return false; return true; } int main() { int n; while( ~scanf("%d",&n) && n ) { for(int i=0; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y); if( is_convexhull(p,n) ) printf("No/n"); else printf("Yes/n"); } return 0; }  

你可能感兴趣的:(UVA 10078 The Art Gallery)