您的位置:首页 > 其它

foj 2148 Moon Game 判断n个点有几个凸四边形 + 枚举4个点 + 判断点在三角形外

2014-06-26 15:08 369 查看
题目来源:
http://acm.fzu.edu.cn/problem.php?pid=2148
 

题意: 判断n个点 可以组成多少个 凸四边形。 

分析: 枚举四个点, 若每个点都在 其他三个点组成的三角形外, 则为 凸四边形, 否则 不是凸四边形。

代码如下:

const int Max_N = 35;
double add(double a, double b){
return (fabs(a + b) < EPS * (fabs(a) + fabs(b))) ? 0 : ( a+b) ;
}
struct Point{
double x , y ;
Point(){}
Point(double x , double y):x(x),y(y){}
Point operator - (Point p){
return Point(add(x ,- p.x) ,add( y ,- p.y)) ;
}
double operator^(Point p){
return add(x * p.y ,- y * p.x) ;
}
}po[Max_N];
double area(Point a, Point b, Point p){
return fabs((a - p)^(b - p)) ;
}
//判断一个点po[h], 是否在三个点pp[i , j , k]构成的三角形外,外 ,返回1
int outside_convex(int h, int i, int j, int k){
double sum = 0 , sums;
sums = area(po[i] , po[j] , po[k]) ;
sum += area(po[i] , po[j] , po[h]) ;
sum += area(po[j] , po[k] , po[h]) ;
sum += area(po[i] , po[k] , po[h]) ;
if(sums != sum)
return 1 ;
return 0;
}
//判断4个点 是否是凸多边形
bool ok(int h, int i, int j, int k){
return outside_convex(h , i, j ,k)
&& outside_convex(i , h, j ,k)
&& outside_convex(j , i, h ,k)
&& outside_convex(k , i, j ,h) ;
}
int main(){
int t , n , i , j , k , h  , tt =1;
int sum ;
scanf("%d" , &t) ;
while(t--){
sum = 0;
scanf("%d" , &n) ;
for(i = 0 ; i < n ; i++){
scanf("%lf%lf" , &po[i].x , &po[i].y) ;
}
for(i = 0 ; i < n -3; i++){  //枚举四个点
for(j = i+1;  j<n-2 ; j++){
for(k =j+1 ; k < n-1 ; k++){
for(h = k+1 ;  h < n ; h++){
if(ok(h, i , j , k)){
sum ++ ;
}
}
}
}
}
printf("Case %d: %d\n" , tt++ , sum ) ;

}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: