FZU

来源:互联网 发布:淘宝直播链接提取 编辑:程序博客网 时间:2024/06/14 08:27
题意明了,找凸四边形个数 
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;}


原创粉丝点击