FZU

来源:互联网 发布:windows未能启动原因是 编辑:程序博客网 时间:2024/06/05 11:50

判断线段相交时,用面积的方法

(上篇博文用叉积判断方向来判断线段是否相交:

FZU - 2148 I - Moon Game 暴力+叉积判方向


#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);}double area(node aa, node b, node c) {    return abs( (b.x-aa.x)*(c.y-aa.y) - (c.x-aa.x)*(b.y-aa.y));}bool is_ok(int a1, int a2, int b1, int b2) {    if(area(a[a1], a[b1], a[b2]) - area(a[a1], a[b1], a[a2]) - area(a[a1], a[a2], a[b2]) > 0) return false;    if(area(a[a2], a[b1], a[b2]) - area(a[a2], a[b1], a[a1]) - area(a[a2], a[a1], a[b2]) > 0) return false;    if(area(a[b1], a[a1], a[a2]) - area(a[b1], a[a1], a[b2]) - area(a[b1], a[a2], a[b2]) > 0) return false;    if(area(a[b2], a[a1], a[a2]) - area(a[b2], a[a1], a[b1]) - area(a[b2], a[a2], a[b1]) > 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(is_ok(i, k, j, y) || is_ok(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;}


原创粉丝点击