当前位置: 首页 > news >正文

Kimi K2.6 快速 LeetCode 3235. 判断矩形的两个角落是否可达 C++实现

LeetCode 3235. 判断矩形的两个角落是否可达 — C++ 实现

题目概述

判断是否存在一条从矩形左下角 `(0, 0)` 到右上角 `(xCorner, yCorner)` 的路径,路径完全在矩形内部,不触碰任何圆的内部和边界,只在起点和终点接触矩形边界。

核心思路

逆向思考:不是找可达路径,而是判断圆是否形成了阻断路径的屏障。如果一系列相交的圆从矩形左上边界连通到右下边界,则会阻断从左下角到右上角的路径。

C++ 实现(DFS + 几何判断)

```cpp
class Solution {
public:
bool canReachCorner(int xCorner, int yCorner, vector<vector<int>>& circles) {
using ll = long long;

// 判断点 (x,y) 是否在圆 (cx,cy,r) 内(含边界)
auto inCircle = [&](ll x, ll y, ll cx, ll cy, ll r) {
return (x - cx) * (x - cx) + (y - cy) * (y - cy) <= r * r;
};

// 判断圆是否与矩形的左边界或上边界相交
auto crossLeftTop = [&](ll cx, ll cy, ll r) {
bool a = abs(cx) <= r && (cy >= 0 && cy <= yCorner);
bool b = abs(cy - yCorner) <= r && (cx >= 0 && cx <= xCorner);
return a || b;
};

// 判断圆是否与矩形的右边界或下边界相交
auto crossRightBottom = [&](ll cx, ll cy, ll r) {
bool a = abs(cx - xCorner) <= r && (cy >= 0 && cy <= yCorner);
bool b = abs(cy) <= r && (cx >= 0 && cx <= xCorner);
return a || b;
};

int n = circles.size();
vector<bool> vis(n);

// DFS:从当前圆出发,寻找是否能连通到右下边界
function<bool(int)> dfs = [&](int i) -> bool {
auto c = circles[i];
ll x1 = c[0], y1 = c[1], r1 = c[2];

// 当前圆已与右下边界相交,说明形成阻断
if (crossRightBottom(x1, y1, r1)) {
return true;
}

vis[i] = true;

for (int j = 0; j < n; ++j) {
if (vis[j]) continue;

auto c2 = circles[j];
ll x2 = c2[0], y2 = c2[1], r2 = c2[2];

// 两圆不相交
if ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) > (r1 + r2) * (r1 + r2)) {
continue;
}

// 两圆相交点在矩形内部,且能继续连通到右下边界
if (x1 * r2 + x2 * r1 < (r1 + r2) * xCorner
&& y1 * r2 + y2 * r1 < (r1 + r2) * yCorner
&& dfs(j)) {
return true;
}
}
return false;
};

for (int i = 0; i < n; ++i) {
auto c = circles[i];
ll x = c[0], y = c[1], r = c[2];

// 如果起点或终点在圆内,直接不可达
if (inCircle(0, 0, x, y, r) || inCircle(xCorner, yCorner, x, y, r)) {
return false;
}

// 如果圆与左上边界相交,且能连通到右下边界,则路径被阻断
if (!vis[i] && crossLeftTop(x, y, r) && dfs(i)) {
return false;
}
}
return true;
}
};
```

关键几何判断说明

判断条件 含义
`inCircle(px, py, cx, cy, r)` 点是否在圆内/圆上
`crossLeftTop(cx, cy, r)` 圆是否与矩形左边界或上边界相交
`crossRightBottom(cx, cy, r)` 圆是否与矩形右边界或下边界相交
`x1*r2 + x2*r1 < (r1+r2)*xCorner` 两圆交点的加权重心在矩形内部

复杂度分析

- 时间复杂度:O(n^2),最坏情况下需要两两判断圆是否相交
- 空间复杂度:O(n),用于访问标记数组和递归栈

注意事项

1. 使用 `long long` 类型:坐标和半径最大可达 10^9,计算距离平方时可能溢出 `int`
2. 两圆相交的内部判断:`x1*r2 + x2*r1 < (r1+r2)*xCorner` 确保交点位于矩形内部,避免圆在矩形外相交导致的误判
3. 起点/终点检查:如果起点 `(0,0)` 或终点 `(xCorner, yCorner)` 在任意圆内,直接返回 `false`

http://www.gsyq.cn/news/1521831.html

相关文章:

  • 用YouTube Data API重建个人推荐过滤器
  • Agentic AI工作流五大设计模式实战指南
  • LabVIEW与STC89C52温湿度监测报警
  • 数据科学家常说的行话:从幽默调侃到技术反思
  • Kimi K2.6 思考 LeetCode 3241. 标记所有节点需要的时间 Java实现
  • 国产芯片新选择:实测裕太微YT9218交换芯片,8口千兆+2.5G上行的工业交换机方案怎么做?
  • Synology硬盘兼容性解锁指南:让群晖NAS支持任意硬盘的终极方案
  • 从硬件连接到代码烧录:富芮坤FR801xH蓝牙开发板实战上手全记录
  • RAG与微调实战决策指南:面向业务的LLM工程化选型
  • Kimi K2.6 思考 LeetCode 3241. 标记所有节点需要的时间 Python3实现
  • Ferret模型原理与多模态指代理解实战
  • MathPrompter:结构化提示+分步验证的数学推理工程方法论
  • 告别破解版!手把手教你用WinLicense 3.1.3.0为你的软件穿上‘防弹衣’
  • 终极解密:3步解锁你的加密音频宝藏,让音乐自由流动
  • 不止于替代:深度评测GD60914 vs MLX90614,在600℃高温、防尘与远距离探测上的实际表现
  • MLflow本地实验追踪实战:30分钟构建可追溯可复现的机器学习工作流
  • 2026图片去背景抠图保姆级教程:专业电脑软件+免费在线网站+手机APP全攻略
  • HAL库真的‘笨重’吗?用CubeMX和LL库在STM32G0上做平衡开发
  • 从单片机到PLC:手把手教你根据项目需求选对迪文串口屏(DGUS vs 指令集避坑指南)
  • Discord机器人定时任务实现详解
  • 多维聚合不是GROUP BY:数据变形术与语义校准实战
  • MLflow生产级落地:PostgreSQL+MinIO构建可审计模型追踪系统
  • 告别隐私合规烦恼:用uniappx插件Ba-IdCode-U一站式搞定Android设备ID获取(附厂商支持清单)
  • 上岸必看!【中药学】真实模考纯净版(卷号:06121219_09)
  • CANN单边通信库hixl在PD分离推理中的实战应用:昇腾NPU大模型Prefill-Decode分离部署与零拷贝通信优化深度指南
  • 给STM32新手的建议:别急着学HAL库,先用标准库搞懂GPIO和TIM(附CubeMX对比)
  • 南京九源安全科技矿车自动灭火系统—以智能主动防御,重塑矿山车辆安全与经济效益
  • 用Python处理气象数据:从NetCDF文件到南京周边温度垂直廓线图(附完整代码)
  • 别再手动点来点去了!用Windows批处理玩转Hex2bin:从校验和到字节填充的进阶配置指南
  • 如何构建高效持续集成系统:WSABuilds自动化构建实战指南