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;}
阅读全文
1 0
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- FZU
- Hibernate 零配置Annotation注解
- 扑克牌的顺子
- PHP 5 Array 函数
- Mysql主从数据库配置详解
- Unity3D面试题
- FZU
- 大数据学习笔记:Hadoop中的IPC与RPC
- mime-type与content-type
- 实现字符串反转
- PHP 5 Calendar 函数
- 电脑挑选注意事项
- 理清gcc、libc、libstdc++的关系
- thinkPHP 怎么修改数据库的一个值,连贯操作,或者修改指定的值,在原来的基础上增添值
- 代码巧用