题目来源:
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 ) ; } }