首页 > 其他 > 详细

fzu Problem 2148 Moon Game(几何 凸四多边形 叉积)

时间:2014-03-24 04:35:44      阅读:458      评论:0      收藏:0      [点我收藏+]

题目:http://acm.fzu.edu.cn/problem.php?pid=2148

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

思路:

因为n很小,所以直接暴力,判断是否为凸四边形的方法是:

如果4个点中存在某个点D,Sabd + Sacd + Sbcd = Sabc,则说明是凹四边形。

 

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 using namespace std;
 8 const double eps = 1e-8;  //定义成double类型
 9 
10 struct point
11 {
12     int x, y;
13 } p[50];
14 double area(point a, point b, point c)
15 {
16     return (fabs((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x))/2);   //一定要fabs(),有可能为负的,
17 }
18 bool ok(point a, point b, point c, point d)
19 {
20     if(fabs(area(b,c,d)-area(a,b,c)-area(a,c,d)-area(a,b,d)) < eps)
21         return false;
22     return true;
23 }
24 int main()
25 {
26     int t, i, j, n, k, ans, a, b;
27     scanf("%d", &t);
28     for(k = 1; k <= t; k++)
29     {
30         ans = 0;
31         scanf("%d", &n);
32         for(i = 0; i < n; i++)
33             scanf("%d%d", &p[i].x, &p[i].y);
34 
35         if(n<4)
36            printf("Case %d: %d", k, ans);
37         else
38         {
39             for(i = 0; i < n; i++)
40                 for(j = i+1; j < n; j++)
41                     for(a = j+1; a < n; a++)
42                         for(b = a+1; b < n; b++)
43                             if(ok(p[i],p[j],p[a],p[b])&&ok(p[j],p[i],p[a],p[b])
44                                &&ok(p[a],p[i],p[j],p[b])&&ok(p[b],p[i],p[j],p[a]))
45                                 {
46                                     ans++;
47                                 }
48             printf("Case %d: %d\n", k, ans);
49         }
50     }
51     return 0;
52 }
bubuko.com,布布扣

fzu Problem 2148 Moon Game(几何 凸四多边形 叉积),布布扣,bubuko.com

fzu Problem 2148 Moon Game(几何 凸四多边形 叉积)

原文:http://www.cnblogs.com/bfshm/p/3620013.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!