几何|阻碍链

rate3775...题目其实很有意义,这样的一个几何题在游戏引擎相关的开发中非常有用,各种光线、模型求交的时候都需要有这样的几何思考能力。

lc3235

DFS遍历相交的圆,判断是否存在圆阻碍矩形左下角到右上角的路径

若圆包含矩形顶点或形成左/上边界到右/下边界的阻碍链则返回false,否则返回true

class Solution {

// 判断点 (x,y) 是否在圆 (ox,oy,r) 内

bool in_circle(long long ox, long long oy, long long r, long long x, long long y) {

return (ox - x) * (ox - x) + (oy - y) * (oy - y) <= r * r;

}

public:

bool canReachCorner(int X, int Y, vector<vector<int>>& circles) {

int n = circles.size();

vector<int> vis(n);

auto dfs = \&(auto&& dfs, int i) -> bool {

long long x1 = circlesi0, y1 = circlesi1, r1 = circlesi2;

// 圆 i 是否与矩形右边界/下边界相交相切

if (y1 <= Y && abs(x1 - X) <= r1 || x1 <= X && y1 <= r1) {

return true;

}

visi = true;

for (int j = 0; j < n; j++) {

long long x2 = circlesj0, y2 = circlesj1, r2 = circlesj2;

// 在两圆相交相切的前提下,点 A 是否严格在矩形内

if (!visj && (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= (r1 + r2) * (r1 + r2) &&

x1 * r2 + x2 * r1 < (r1 + r2) * X &&

y1 * r2 + y2 * r1 < (r1 + r2) * Y &&

dfs(dfs, j)) {

return true;

}

}

return false;

};

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

long long x = circlesi0, y = circlesi1, r = circlesi2;

if (in_circle(x, y, r, 0, 0) || // 圆 i 包含矩形左下角

in_circle(x, y, r, X, Y) || // 圆 i 包含矩形右上角

// 圆 i 是否与矩形上边界/左边界相交相切

!visi && (x <= X && abs(y - Y) <= r || y <= Y && x <= r) && dfs(dfs, i)) {

return false;

}

}

return true;

}

};

java推论版

并查集过925/978 case

class UnionFind {

}

class Solution {

public boolean canReachCorner(int x, int y, int\[\]\[\] a) {

int n = a.length;

// space: O(n);

// time:

UnionFind uf = new UnionFind(n + 2);

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

int\[\] p = ai;

int x1 = p0, y1 = p1, r1 = p2;

// 判断紫色边

if(x1 - r1 <= 0 || y1 + r1 >= y)

uf.union(i, n);

// 判断红色边

if(y1 - r1 <= 0 || x1 + r1 >= x)

uf.union(i, n + 1);

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

int\[\] q = aj;

int x2 = q0, y2 = q1, r2 = q2;

if((long)(x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) <= (long)(r2 + r1) * (r2 + r1)){

uf.union(i, j);

}

}

}

if(uf.isUnion(n, n + 1))

return false;

return true;

}

}

dfs check ac

  1. inCircle 方法:判断点是否在圆内,避免浮点运算,用平方和比较。

  1. dfs 方法:深搜相连的圆,判断是否能从左/上边界 连通到右/下边界

  1. canReachCorner 主方法:初始化变量后,遍历每个圆,若包含矩形顶点则直接返回 false ;

若与左/上边界相交则启动DFS,若DFS返回 true (连通右/下边界)则返回 false ,否则最终返回 true 。

class Solution {

int X;

int Y;

int\[\]\[\] a;

boolean\[\] vis;

int n;

long x, y, r; // 用于inCircle方法的临时变量

// 判断点(targetX, targetY)是否在圆(x,y,r)内(包括边界)

private boolean inCircle(long x, long y, long r, long targetX, long targetY) {

return (targetX - x) * (targetX - x) + (targetY - y) * (targetY - y) <= r * r;

}

// DFS遍历相连的圆,判断是否能从左/上边界连通到右/下边界

private boolean dfs(int i) {

long x1 = ai0, y1 = ai1, r1 = ai2;

// 判断是否连通到右/下边界

if (y1 <= Y && Math.abs(X - x1) <= r1 ||

x1 <= X && y1 - 0 <= r1 ||

x1 > X && inCircle(x1, y1, r1, X, 0)) {

return true;

}

visi = true;

// 遍历所有其他圆,判断是否相交/相切且交集在矩形内

for (int j = 0; j < n; j++) {

if (i == j || visj) continue;

long x2 = aj0, y2 = aj1, r2 = aj2;

// 两圆相交/相切 且 交集在矩形内的条件

if ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= (r1 + r2) * (r1 + r2) &&

r1 * y2 + r2 * y1 < (r1 + r2) * Y &&

r1 * x2 + r2 * x1 < (r1 + r2) * X) {

if (dfs(j)) {

return true;

}

}

}

return false;

}

public boolean canReachCorner(int X, int Y, int\[\]\[\] a) {

this.X = X;

this.Y = Y;

this.a = a;

this.n = a.length;

this.vis = new booleann;

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

long x = ai0, y = ai1, r = ai2;

// 若圆包含起点(0,0)或终点(X,Y),直接不可达

if (inCircle(x, y, r, 0, 0) || inCircle(x, y, r, X, Y))

return false;

// 若圆与左/上边界相交且未访问,DFS判断是否连通到右/下边界

if (!visi && (x <= X && Math.abs(y - Y) <= r ||

y <= Y && x - 0 <= r ||

y > Y && inCircle(x, y, r, 0, Y))) {

if (dfs(i)) {

return false;

}

}

}

return true;

}

};

相关推荐
木木子2212 小时前
# 密码强度检测深度解析:正则表达式实时分析、多维度评分算法与可视化反馈
mysql·算法·华为·正则表达式·harmonyos
Sw1zzle15 小时前
算法入门(四):二叉树 - 递归遍历三件套
算法·leetcode
万法若空16 小时前
【算法-查找】查找算法
java·数据结构·算法
海石16 小时前
子树怎么找?树的3种遍历方式来帮忙!
算法·leetcode
海石16 小时前
难度分 1588:思路 + 技巧 = AC
算法·leetcode
珠海西格电力19 小时前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
还有多久拿退休金21 小时前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby1 天前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀1 天前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince1 天前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法