Skip to content

Commit 510f462

Browse files
authored
Create 3235-check-if-the-rectangle-corner-is-reachable.js
1 parent e663b84 commit 510f462

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
* @param {number} X
3+
* @param {number} Y
4+
* @param {number[][]} circles
5+
* @return {boolean}
6+
*/
7+
var canReachCorner = function(X, Y, circles) {
8+
let width = X, height = Y
9+
const numCircles = circles.length
10+
const circleInfo = circles.map((circle) => [circle[0], circle[1], circle[2]])
11+
const adjacencyList = Array.from({ length: numCircles + 4 }, () => [])
12+
13+
for (let i = 0; i < numCircles; i++) {
14+
const [x, y, radius] = circleInfo[i]
15+
16+
if (x - radius <= 0) {
17+
adjacencyList[i].push(numCircles)
18+
adjacencyList[numCircles].push(i)
19+
}
20+
if (width - x <= radius) {
21+
adjacencyList[i].push(numCircles + 2)
22+
adjacencyList[numCircles + 2].push(i)
23+
}
24+
if (y - radius <= 0) {
25+
adjacencyList[i].push(numCircles + 1)
26+
adjacencyList[numCircles + 1].push(i)
27+
}
28+
if (height - y <= radius) {
29+
adjacencyList[i].push(numCircles + 3)
30+
adjacencyList[numCircles + 3].push(i)
31+
}
32+
33+
for (let j = i + 1; j < numCircles; j++) {
34+
const [x2, y2, radius2] = circleInfo[j]
35+
const dx = x - x2
36+
const dy = y - y2
37+
const distanceSquared = dx * dx + dy * dy
38+
const radiusSum = radius + radius2
39+
40+
if (distanceSquared <= radiusSum * radiusSum) {
41+
adjacencyList[i].push(j)
42+
adjacencyList[j].push(i)
43+
}
44+
}
45+
}
46+
47+
function bfs(startNode, targetNode1, targetNode2) {
48+
const queue = [startNode]
49+
const visited = Array(numCircles + 4).fill(0)
50+
visited[startNode] = 1
51+
52+
while (queue.length > 0) {
53+
const currentNode = queue.shift()
54+
for (const neighbor of adjacencyList[currentNode]) {
55+
if (!visited[neighbor]) {
56+
visited[neighbor] = 1
57+
queue.push(neighbor)
58+
}
59+
}
60+
}
61+
return visited[targetNode1] || visited[targetNode2]
62+
}
63+
64+
return !(
65+
bfs(numCircles, numCircles + 1, numCircles + 2) ||
66+
bfs(numCircles + 3, numCircles + 2, numCircles + 1)
67+
)
68+
};

0 commit comments

Comments
 (0)