HDU

来源:互联网 发布:linux 中telnet命令 编辑:程序博客网 时间:2024/06/04 00:22

问题本质:给定点集,判断线段相交

运用方法:叉积(方向性)判线段相交


代码中 的 is_inter 函数 判断 线段a-b 和 c-d 是否相交

需要6个条件,其中 area 函数是假的面积,只是为了提供一个正负性(可以先去学一波向量的叉积)


#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 30 + 7, maxd = 100 + 7, mod = 1e9 + 7;const ll INF = 0x7f7f7f7f;int n, a[maxn];struct node {    ll x, y;}p[maxn][maxd];ll area(node a, node b, node c) {    return (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);}bool is_inter(node a, node b, node c, node d) {    if(max(a.x, b.x) > min(c.x, d.x) &&       max(c.x, d.x) > min(a.x, b.x) &&       max(a.y, b.y) > min(c.y, d.y) &&       max(c.y, d.y) > min(a.y, b.y) &&       area(a, b, c) * area(a, b, d) <= 0 &&       area(c, d, a) * area(c, d, b) <= 0 ) return 1;    return 0;}bool is_ok() {    for(int l1 = 1; l1 < n; ++l1) {        for(int l2 = l1+1; l2 <= n; ++l2) {            for(int i = 1; i < a[l1]; ++i) {                for(int j = 1; j < a[l2]; ++j) {                    if( is_inter(p[l1][i], p[l1][i+1], p[l2][j], p[l2][j+1]) ) return 1;                }            }        }    }    return 0;}int main() {    int i, j;    while(~scanf("%d", &n)) {        for(int i = 1; i <= n; ++i) {            scanf("%d", &a[i]);            for(int j = 1; j <= a[i]; ++j) {                scanf("%I64d %I64d", &p[i][j].x, &p[i][j].y);            }        }        if(n == 1) puts("No");        else printf("%s\n", is_ok() ? "Yes" : "No");    }    return 0;}


原创粉丝点击