首页 > 代码库 > FZU 2148 Moon Game --判凹包
FZU 2148 Moon Game --判凹包
题意:给一些点,问这些点能够构成多少个凸四边形
做法:
1.直接判凸包
2.逆向思维,判凹包,不是凹包就是凸包了
怎样的四边形才是凹四边形呢?凹四边形总有一点在三个顶点的内部,假如顶点为A,B,C,D,则构成四个三角形:ABC,ACD,ABD,BCD,假如某一个三角形(最外的三个顶点)的面积等于另三个三角形面积之和,则是凹四边形。
然后做四个for循环,枚举即可,因为N最多才30.
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>using namespace std;#define N 1007#define M 33struct Point{ double x,y;}p[34];double calc_area(Point a,Point b,Point c) //叉积求三角形面积{ return fabs(a.x*b.y + c.x*a.y + b.x*c.y - c.x*b.y - a.x*c.y - b.x*a.y)*0.5;}int main(){ int t,i,n; int j,k,h; int cs = 1; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); int cnt = 0; 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++) { double Area1 = calc_area(p[i],p[j],p[k]); double Area2 = calc_area(p[i],p[j],p[h]); double Area3 = calc_area(p[j],p[k],p[h]); double Area4 = calc_area(p[i],p[k],p[h]); //printf("%lf %lf %lf %lf\n",Area1,Area2,Area3,Area4); if(fabs(Area1-Area2-Area3-Area4) < eps) continue; if(fabs(Area2-Area3-Area4-Area1) < eps) continue; if(fabs(Area3-Area1-Area2-Area4) < eps) continue; if(fabs(Area4-Area1-Area2-Area3) < eps) continue; cnt++; } } } } printf("Case %d: %d\n",cs++,cnt); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。