蓝桥杯-每日刷题-022

线段相交

一、题目要求

  • 题目描述
    输入线段AB、CD的两端点,判断两线段是否相交(包含端点)。
  • 输入格式
    有多组数据,每组数据两行,第一行四个整数,分别表示A、B两点坐标,第二行四个整数,分别表示C、D两点坐标。
  • 输出格式
    如果线段AB与线段CD相交,输出yes,否则输出no。
  • 输入样例
    0 1 1 1
    1 0 2 1
    1 0 2 1
    0 1 2 0
    0 0 0 1
    1 0 0 0
  • 输出样例
    no
    yes
    yes

二、完整代码

cpp 复制代码
#include<iostream>

std::string is(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
    int d1, d2, d3, d4;
    d1 = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);//向量AB * AC的叉积
    d2 = (x2 - x1) * (y4 - y1) - (y2 - y1) * (x4 - x1);//AB * AD
    d3 = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);//CD * CA
    d4 = (x4 - x3) * (y2 - y3) - (y4 - y3) * (x2 - x3);//CD * CB
    if (std::max(x1, x2) < std::min(x3, x4) || std::max(x3, x4) < std::min(x1, x2)
        || std::max(y1, y2) < std::min(y3, y4) || std::max(y3, y4) < std::min(y1, y2))
        return "no";
    else if (d1 * d2 <= 0 && d3 * d4 <= 0)
        return "yes";
    else
        return "no";
}
int main()
{
    int x1, y1, x2, y2, x3, y3, x4, y4;
    while (std::cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4)
    {
        std::cout << is(x1, y1, x2, y2, x3, y3, x4, y4) << std::endl;
    }

    return 0;
}
相关推荐
草履虫建模14 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq16 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq16 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq17 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)18 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi18 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
CSDN_RTKLIB18 小时前
【四个场景测试】源文件编码UTF-8 BOM
c++
不能隔夜的咖喱18 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头18 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头19 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机