FZU
来源:互联网 发布:淘宝直播链接提取 编辑:程序博客网 时间:2024/06/14 08:27
题意明了,找凸四边形个数
n = 30;四重循环暴力
排好序后我们知道对角线可能是 1-3和2-4,,也可能是 1-4和2-3,,只需判断对角线是否相交就可以判断是否为凸四边形
这里用叉积判是否相交:(下一篇博文用面积法判相交)
n = 30;四重循环暴力
排好序后我们知道对角线可能是 1-3和2-4,,也可能是 1-4和2-3,,只需判断对角线是否相交就可以判断是否为凸四边形
这里用叉积判是否相交:(下一篇博文用面积法判相交)
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<set>#include<stack>#include<queue>#include<algorithm>// cout << " === " << endl;using namespace std;typedef long long ll;const int maxn = 100 + 7, INF = 0x3f3f3f3f, mod = 1e9+7;int T, n;struct node { int x, y;}a[maxn];bool cmp(node a_, node b_) { if(a_.x == b_.x) return a_.y < b_.y; return a_.x < b_.x;}void init() { for(int i = 0; i < n; ++i) scanf("%d%d", &a[i].x, &a[i].y); sort(a, a+n, cmp);}bool inter(int a1, int a2, int a3, int a4) { if( 1.0*((a[a1].x-a[a3].x)*(a[a4].y-a[a3].y)-(a[a1].y-a[a3].y)*(a[a4].x-a[a3].x))/10000.0 * 1.0*((a[a4].x-a[a3].x)*(a[a2].y-a[a3].y)-(a[a4].y-a[a3].y)*(a[a2].x-a[a3].x))/10000.0 < 0.0) return false; if( 1.0*((a[a4].x-a[a1].x)*(a[a2].y-a[a1].y)-(a[a4].y-a[a1].y)*(a[a2].x-a[a1].x))/10000.0 * 1.0*((a[a2].x-a[a1].x)*(a[a3].y-a[a1].y)-(a[a2].y-a[a1].y)*(a[a3].x-a[a1].x))/10000.0 < 0.0) return false; return true;}void solve() { int cnt = 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 y = k+1; y < n; ++y) { if(inter(i, k, j, y) || inter(i, y, j, k)) cnt++; } } } } cout << cnt << endl;}int main() { scanf("%d", &T); int kase = 1; while(T--) { cin >> n; init(); printf("Case %d: ", kase++); solve(); } return 0;}