第十六届四川省大学生程序设计竞赛

news/2024/11/9 1:38:07 标签: 算法, c++

F. Isoball: 2D Version

题意:给定一个圆和一个矩阵还有圆行走的方向,问圆往这个方向是否能让整个圆都在矩阵内

分析:先判断圆是否能在矩阵里,再看圆心运动轨迹是否与小矩阵有焦点(只要圆心在小矩阵就一定在矩阵里)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define x first
#define y second
typedef long double ld;
void sol(){
        ld x, y, r, vx, vy; // 圆的初始位置 半径 速度向量
        ld lx, ly, rx, ry, llx, lly, rrx, rry; // 矩形位置
        cin >> x >> y >> r >> vx >> vy >> lx >> ly >> rx >> ry;
        llx = lx + r, lly = ly + r, rrx = rx - r, rry = ry - r;
        if (abs(rx-lx)<2*r || abs(ry-ly)<2*r) {//判断圆能否被矩形完全包围
            cout << "No" << endl;
            return; 
        }
        if (vx == 0) { // 当圆沿着y轴方向能否直接进入矩形
            if (llx <= x && x <= rrx) {//x轴位置是否符合
                if ((vy < 0 && y >= lly) || (vy >= 0 && y <= rry)) {//往下并且圆在上面或者往上并且圆在下面 
                    cout << "Yes" << endl;
                    return;
                }
            }
            cout << "No" << endl;
            return;
        }
        if (vy == 0) {//当圆沿着x轴方向能否直接进入矩形
            if (lly <= y && y <= rry ) {
                if ((vx < 0 && x >= llx) || (vx >= 0 && x <= rrx)) {
                    cout << "Yes" << endl;
                    return;
                }
            }
            cout << "No" << endl;
            return;
        }
        pair<ld, ld> o1, o2, o3, o4;
        // 圆心与四条边相交的位置,o1o3为与两边相交可能位置
        // Δy/Δx=vx/vy Y=y+Δy :Y=y+(Δx*vy)/vx X=x+Δx :X=x+(Δy*vx)/vy
        o1.x = llx, o1.y = vy * (o1.x - x) / vx + y;//x=llx
        o3.x = rrx, o3.y = vy * (o3.x - x) / vx + y; //x==rry
        o2.y = rry, o2.x = vx * (o2.y - y) / vy + x;//y==rry
        o4.y = lly, o4.x = vx * (o4.y - y) / vy + x;//y==lly
        //  cout<<o1.x<<" "<<o1.y<<"\n"<<o2.x<<" "<<o2.y<<"\n"<<o3.x<<" "<<o3.y<<"\n"<<o4.x<<" "<<o4.y<<"\n";
        // 从圆心出发的射线能否与矩形四条边相交,检查oi是否会与矩形边相交
        bool s1 = 1, s2 = 1, s3 = 1, s4 = 1;
        if (vx > 0) {//方向 
            if (o1.x < x)
                s1 = 0;
            if (o2.x < x)
                s2 = 0;
            if (o3.x < x)
                s3 = 0;
            if (o4.x < x)
                s4 = 0;
        } else {
            if (o1.x > x)
                s1 = 0;
            if (o2.x > x)
                s2 = 0;
            if (o3.x > x)
                s3 = 0;
            if (o4.x > x)
                s4 = 0;
        }
        if (vy > 0) {
            if (o1.y < y)
                s1 = 0;
            if (o2.y < y)
                s2 = 0;
            if (o3.y < y)
                s3 = 0;
            if (o4.y < y)
                s4 = 0;
        } else {
            if (o1.y > y)
                s1 = 0;
            if (o2.y > y)
                s2 = 0;
            if (o3.y > y)
                s3 = 0;
            if (o4.y > y)
                s4 = 0;
        }
        if (o1.y < lly || o1.y > rry)//在有效区间内 
            s1 = 0;
        if (o2.x < llx || o2.x > rrx)
            s2 = 0;
        if (o3.y < lly || o3.y > rry)
            s3 = 0;
        if (o4.x < llx || o4.x > rrx)
            s4 = 0;
        // 若有一个点与矩形相交,说明在矩形内部
        if (s1 || s2 || s3 || s4) {
            cout << "Yes" << endl;
            return;
        }
        cout << "No" << endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t;cin>>t;
    while(t--)sol();
    return 0;
}
​

http://www.niftyadmin.cn/n/5744687.html

相关文章

springBoot 自动配置与starter

目录 一、自动配置 Springboot实现自动配置的核心机制 Conditional的作用是什么&#xff1f; 如何自定义自动配置&#xff1f; 步骤 例子分析 自动配置的优先级 如何禁用特定的自动配置&#xff1f; 二、starter 如何理解Spring Boot中的starter&#xff1f; 如何自…

Jmeter常见的几种报错及解决方案

在性能测试的过程中&#xff0c;使用JMeter进行负载测试是一项常见而重要的任务。然而&#xff0c;测试中常常会遇到各种报错&#xff0c;这些问题可能会影响测试结果的准确性。了解这些错误的原因及解决方案&#xff0c;是每位测试工程师必备的技能 进行Jmeter项目练习的时候…

【Apache ECharts】<农作物病害发生防治面积>

在vs Code里打开&#xff0c; 实现 1. 首先引入 echarts.min.js 资源 2. 在body部分设一个 div&#xff0c;设置 id 为 main 3. 设置 script 3.1 基于准备好的dom&#xff0c;初始化echarts实例 var myChart echarts.init(document.getElementById(main)); 3.2 指定图表的…

蓝桥杯c++算法学习【1】之枚举与模拟(卡片、回文日期、赢球票:::非常典型的比刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 枚举与模拟 一、卡片&#xff1a; 【问题描述】 …

C 语言函数指针 —— 实现程序分层

通过函数指针实现上层与底层应用的分层&#xff0c;将有助于代码更便于 Debug。 在 main.c 中只做最简单的调用&#xff0c;有助于条理清晰。 // // main.c // testc // // Created by Joey Wang on 2024/11/8. //#include <stdio.h> #include "myfunc_config.…

非https下js写文本到剪切板

代码如下好用 var dummy document.createElement("textarea"); // 创建一个隐藏的文本区域元素document.body.appendChild(dummy); // 将该元素添加到页面中dummy.value e; // 将要复制的文本赋值给该元素dummy.select(); // 选择该元素的内容document.execCom…

【JS】this关键字的相关问题

我是目录 引言this为什么要用this对this的误解this并不指向自身this 并不指向普通函数的作用域this的绑定方式默认绑定(Default Binding)隐式绑定(Implicit Binding)隐式绑定丢失面试实战显式绑定(Explicit Binding)硬绑定软绑定call apply bind的区别call函数实现apply函数实现…

【数据集】【YOLO】【目标检测】口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程!

数据集介绍 【数据集】口罩佩戴检测数据集 1971 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: face_mask}&#xff0c;佩戴口罩。 数据集来自国内外图片网站和视频截图。 检测场景为城市街道、医院、商场、机场、车站、办…