题目意思:

给出n个线段,推断这n条线段中,线段相交的对数。

http://acm.hdu.edu.cn/showproblem.php?pid=1086

题目分析:

此题主要写出推断线段相交的函数,然后推断每一对线段就可以,时间复杂度O(n*n)。详解见代码。

AC代码:

/**

 *推断AB和CD两线段是否有交点:

 *同一时候满足两个条件:('x'表示叉积)

 * 1.C点D点分别在AB的两側.(向量(ABxAC)*(ABxAD)<=0)

 * 2.A点和B点分别在CD两側.(向量(CDxCA)*(CDxCB)<=0)

 *   3.  向量(ABxAC)*(ABxAD)<0代表在直线两側, =0代表在直线上。

 */

#include<iostream>

#include<cmath>

#include<cstring>

#include<cstdio>

#include<algorithm>

using namespace std;

typedef struct Node{

    double x,y;

}node;

node p[105],p1[101];

double Direction(node pi,node pj,node pk){//计算叉乘

    return (pk.x-pi.x)*(pj.y-pi.y)-(pj.x-pi.x)*(pk.y-pi.y);

}



bool Segments_X(node p1,node p2,node p3,node p4){//推断两条线段是否相交

    double d1,d2,d3,d4;

    d1=Direction(p3,p4,p1);

    d2=Direction(p3,p4,p2);

    d3=Direction(p1,p2,p3);

    d4=Direction(p1,p2,p4);

    if(d1*d2<=0&&d3*d4<=0) return true;

    return false;

}

int main()

{

    int n;

    while(cin>>n&&n){

        for(int i=1;i<=n;i++){

            cin>>p[i].x>>p[i].y>>p1[i].x>>p1[i].y;

        }

        int k=0;

        for(int i=1;i<=n-1;i++){

            for(int j=i+1;j<=n;j++){

                if(Segments_X(p[i],p1[i],p[j],p1[j])) k++;

            }

        }

        cout<<k<<endl;

    }

    return 0;

}

hdu1086(线段相交)的更多相关文章

  1. You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...

  2. POJ 1066 Treasure Hunt (线段相交)

    题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ...

  3. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...

  4. HDU1086You can Solve a Geometry Problem too(判断线段相交)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  5. POJ 2653 Pick-up sticks【线段相交】

    题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...

  6. POJ 1556 The Doors【最短路+线段相交】

    思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...

  7. 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)

    传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...

  8. 【POJ 2653】Pick-up sticks 判断线段相交

    一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...

  9. hdu 1558 线段相交+并查集

    题意:要求相交的线段都要塞进同一个集合里 sol:并查集+判断线段相交即可.n很小所以n^2就可以水过 #include <iostream> #include <cmath> ...

随机推荐

  1. TypeScript 5 Angular 2

    TypeScript 5 分钟快速入门 翻译:Angular 2 - TypeScript 5 分钟快速入门 原文地址:https://angular.io/docs/ts/latest/quicks ...

  2. js字的数目的计算方法(与word计算公式为)

    [背景] 用户往往需要一定数量的单词填写必填字段限制,但js由value.length取出来的往往差异很大,与实际的话.通常真正的用户抱怨.很显然,我没有写那么多字,但系统提示超过字数限制.然后,我学 ...

  3. POJ 2352 Stars 树阵

    标题效果:特定y值在升序一些点.一个点的定义level值点的数目对于其左下,每个请求level多少分. 思维:因为y值它是按升序.所以分的差距仅仅是推断x值相比之前的大.就用树状数组维护. CODE: ...

  4. 【Android进阶】SlidingMenu实现侧滑栏效果的实现

    public class MainActivity extends Activity { @Override protected void onCreate(final Bundle savedIns ...

  5. ProgressMonitorInputStream

    Swing类包中有一个很有用的流过滤器,ProgressMonitorInputStream,它可以自动弹出一个对话框,监视已经读取了多少流. 进度监视器流使用InputStream类的availab ...

  6. 它们的定义actionbar 并删除留空

    通过他们自己的定义actionbar布局变化actionbar样式,简单而美丽.但有一个细节需要注意的是,高分辨率的问题留空.一般720上述决议,下一次你发现,无论什么样的变化总是会有一个小的布局文件 ...

  7. error LNK2019: 解析的外部符号 __imp__DispatchMessageW@4,在函数的符号 _WinMain@16 据引述

    错误: 1>WinMain.obj : error LNK2019: 解析的外部符号 __imp__DispatchMessageW@4,在函数的符号 _WinMain@16 据引述 1> ...

  8. Oracle cloud control 12c 的启动与关闭

    Oracle cloud control 12c整个安装比較复杂,光是安装路径的选择,登录password,端口号等众多个配置不免让人眼花缭乱,目不暇接.本文描写叙述的是安装完成后怎样获取安装时设定的 ...

  9. 具体解释首页被K后SEOer必做的三大排除方法!

    近段时间.有非常多朋友向新辰抱怨说出大问题了,为神马site不到首页了,并且收录变成了0?唉,新辰不得不非常同情的告诉你:你的首页真的被K了!好了.作为一个职业SEOer.面对被K宛如已经看破红尘般没 ...

  10. NSIS脚本:在卸载页面收集信息

    原文 NSIS脚本:在卸载页面收集信息 此功能用于在软件卸载时收集相关信息,以便进行后续改进.实现功能如图: 以下为实现代码: 01 !include nsDialogs.nsh 02 !includ ...