当前位置: 代码迷 >> 综合 >> FZU-2148 求n个点构成的凸四边形的个数
  详细解决方案

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

热度:80   发布时间:2023-12-12 00:16:09.0

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)