FZU 2148 Moon Game(几何题)

题目链接:FZU 2148 Moon Game

几何体。

判断是不是凹四边形。

如果四边形有一个点在另外三个点组成的三角形内部,这个四边形就是凹四边形,否则就是凸四边形。

凹四边形内部那个点和其余任意两点可以组成三个三角形,这三个三角形面积的和恰好为外部三个点组成的三角形面积,想到这里这题就可以做了。

根据三角形三个点的二维坐标求三角形面积有个公式:abs(p[a].x * p[b].y + p[c].x * p[a].y + p[b].x * p[c].y - p[c].x * p[b].y - p[a].x * p[c].y - p[b].x * p[a].y) * 0.5。

#include <iostream>
#include <cmath>
#include <stdio.h>

using namespace std;

const int MAX_N = 30 + 5;
const double e = 1e-7;

struct Point
{
    int x, y;
};
int T, n, cnt, num;
Point p[MAX_N];
double get_area(int a, int b, int c)
{
    return abs(p[a].x * p[b].y + p[c].x * p[a].y + p[b].x * p[c].y - p[c].x * p[b].y - p[a].x * p[c].y - p[b].x * p[a].y) * 0.5;
}
bool solve(int i, int j, int k, int m)
{
    double sum, a, b, c;
    sum = get_area(j, k, m);
    a = get_area(i, j, k);
    b = get_area(i, j, m);
    c = get_area(i, k, m);
    if(fabs(sum - a - b - c) < e)
        return false;
    sum = get_area(i, j, k);
    a = get_area(i, j, m);
    b = get_area(j, k, m);
    c = get_area(i, k, m);
    if(fabs(sum - a - b - c) < e)
        return false;
    sum = get_area(i, k, m);
    a = get_area(i, j, k);
    b = get_area(i, j, m);
    c = get_area(j, k, m);
    if(fabs(sum - a - b - c) < e)
        return false;
    sum = get_area(i, j, m);
    a = get_area(i, j, k);
    b = get_area(i, k, m);
    c = get_area(j, k, m);
    if(fabs(sum - a - b - c) < e)
        return false;
    return true;
}
int main()
{
    cin >> T;
    num = 0;
    while(T--)
    {
        cin >> n;
        cnt = 0;
        for(int i = 1; i <= n; i++)
            cin >> p[i].x >> p[i].y;
        for(int i = 1; i <= n; i++)
        {
            for(int j = i + 1; j<= n; j++)
            {
                for(int k = j + 1; k <= n; k++)
                {
                    for(int m = k + 1; m <= n; m++)
                    {
                        if(solve(i, j, k, m))
                            cnt++;
                    }
                }
            }
        }
        printf("Case %d: %d\n", ++num, cnt);
    }
    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值