FOJ 2148 给定的二维坐标 能构成的凸四边形数
2013-12-22 20:46
369 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2148
题意:
求给定的二维坐标能构成的凸四边形数
思路:
我们可以得到一个结论:
当且仅当四边形为凸四边形时,对角线能相交 -> 若四边形存在线段相交就是凸四边形
题意:
求给定的二维坐标能构成的凸四边形数
思路:
我们可以得到一个结论:
当且仅当四边形为凸四边形时,对角线能相交 -> 若四边形存在线段相交就是凸四边形
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; #define ST 1001 #define EN 1002 #define M 10000 #define inf 1000000 #define eps 1e-8 #define PR 1e-8 struct Point{//点是2维的 double x,y; }p[50]; struct v{ Point Start,End; }; double Cross(Point p1,Point p2,Point p3,Point p4){//二维向量(p1p2)X(p3p4) 返回第三向量长度 double x1=p2.x-p1.x,y1=p2.y-p1.y; double x2=p4.x-p3.x,y2=p4.y-p3.y; return x1*y2-x2*y1; //为0表示 p1p2 与p3p4共线 //直线:不为0就是相交 } double Cross_v(v v1,v v2){ return Cross(v1.Start,v1.End,v2.Start,v2.End); } double point_dis(Point p1,Point p2){ return sqrt((double)((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))); } bool On_Segment(Point p1,Point p2,Point p3){//p3点在 p1p2线段上 if(Cross(p1,p2,p1,p3)!=0)return false; bool iny=(p1.y<=p3.y && p3.y<=p2.y)||(p1.y>=p3.y && p3.y>=p2.y); bool inx=(p1.x<=p3.x && p3.x<=p2.x)||(p1.x>=p3.x && p3.x>=p2.x); if(inx && iny)return true; return false; } bool Segmentintersect(Point p1,Point p2,Point p3,Point p4){//p1p2 是否与 p3p4相交 double cross_1=Cross(p3,p4,p3,p1),cross_2=Cross(p3,p4,p3,p2);//cross_1 2必须一正一负且都不为0 double cross_3=Cross(p1,p2,p1,p3),cross_4=Cross(p1,p2,p1,p4);//cross_2 4必须一正一负且都不为0 //表示a线段 2点 在b线段 2侧 if(cross_1*cross_2<0 && cross_3*cross_4<0)return true; //a线段端点在 b线段上 视情况取舍这种位置 // if(cross_1==0 && On_Segment(p3,p4,p1))return true; // if(cross_2==0 && On_Segment(p3,p4,p2))return true; // if(cross_3==0 && On_Segment(p1,p2,p3))return true; // if(cross_4==0 && On_Segment(p1,p2,p4))return true; return false; } int ok(Point a,Point b, Point c,Point d){ bool ans = Segmentintersect(a,b,c,d) ; ans|= Segmentintersect(a,c,b,d) ; ans|= Segmentintersect(a,d,c,b) ; return ans; } int main() { int T,Cas = 1; scanf("%d",&T); int i, j, k, l; while(T--){ int n, ans=0;scanf("%d",&n); for(i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y); for(i = 0; i < n; i++) for(j = i+1; j <n; j++) for(k = j+1;k<n;k++) for(l = k+1;l<n;l++) ans += ok(p[i],p[j],p[k],p[l]); printf("Case %d: %d\n",Cas++,ans); } return 0; } /* 99 4 0 0 100 0 0 100 100 100 4 0 0 100 0 0 100 10 10 */
相关文章推荐
- [Java]给定二维平面中的4个坐标点,如何判定这四个坐标点能否构成长方形?(经_典_面_试_题_目)
- MATLAB 给定一组二维坐标,拟合曲线并且取曲线上任意点的坐标方法,或者均分定义域,得到对应值方法
- 验证“哥德巴赫猜想”/水仙花数/给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形
- Foj 2148 二维几何(点是否在三角形内)
- FZU-2148 求n个点构成的凸四边形的个数
- foj 2148 Moon Game 判断n个点有几个凸四边形 + 枚举4个点 + 判断点在三角形外
- FOJ 2148(求凸四边形数量)
- hdu6055 Regular polygon 脑洞几何 给定n个坐标(x,y)。x,y都是整数,求有多少个正多边形。因为点都是整数点,所以只可能是正四边形。
- UVALive 5102 Fermat Point in Quadrangle 极角排序+找距离二维坐标4个点近期的点
- 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
- C语言:写一个函数,使给定的一个3x3二维整型数组转置,即行列互换
- D3.js制作二维坐标轴基本入门
- light oj 1305 - Area of a Parallelogram (数学 平行四边形坐标和面积)
- HDU5925:Coconuts(二维坐标离散化 + DFS)
- 球面点三维坐标到纹理二维坐标的转换
- 通过gps给定的两个经纬度坐标,计算两点之间的距离
- 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
- 趣题:用正三角形和正四边形构成凸多边形
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- 计算机图形学06一一像素坐标和二维坐标的区别