FZU-2148 求n个点构成的凸四边形的个数

https://vjudge.net/problem/FZU-2148
题目的大致意思就是给你n个点。让你计算这个点可以构成的凸四边形的个数。
看到一个超级厉害的解法。就是道理其实都懂可是我就是没想到。所以觉得他厉害吧。
对于一个凹四边形来说。把各个顶点相连。就会得到三个三角形。这三个三角形的面积加和就等于大三角形的面积。凸三角形就不行。自己画画就能想到了。
直接上代码吧。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct point{
    int x,y;
}arr[35];
double area(int a,int b,int c){
    return fabs(arr[b].x*arr[a].y-arr[c].x*arr[a].y-arr[a].x*arr[b].y+arr[c].x*arr[b].y+ arr[a].x*arr[c].y-arr[b].x*arr[c].y)/2;
}

int judge(int a,int b,int c,int d){
    if(area(a,b,c)==(area(a,b,d)+area(a,c,d)+area(b,c,d))){
        return 0;
    }
    return 1;
}
int main(){
    int T;
    cin>>T;
    int kase=0;
    while(T--){
        memset(arr,0,sizeof(arr));
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>arr[i].x>>arr[i].y;
        }
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                for(int k=j+1;k<n;k++){
                    for(int l=k+1;l<n;l++){
                        if(judge(i,j,k,l)&&judge(i,j,l,k)&&judge(j,l,k,i)&&judge(i,l,k,j)){
                            ans++;
                        }
                    }
                }
            }
        }
        printf("Case %d: %d\n",++kase,ans);
    }
    return 0;
}

关于那个三角形面积计算公式啊。
就是可以用三个点的坐标就可以求面积。
设A(x1,y1),B(x2,y2),C(x3,y3)
由A–>B–>C–>A 按逆时针方向转。(行列式书写要求)
设三角形的面积为S
则S=(1/2)*(下面行列式)
|x1 y1 1|
|x2 y2 1|
|x3 y3 1|
S=(1/2)*(x1y2*1+x2y3*1+x3y1*1-x1y3*1-x2y1*1-x3y2*1)
即用三角形的三个顶点坐标求其面积的公式为:
S=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值