AlgoDaily 22: Count the Planes
https://algodaily.com/challenges/count-the-planes
This is the same as the island counting problem.
function* enumerateGrid(grid) {
if (!grid || grid.length < 1 || !grid[0].length) {
return;
}
for (let x = 0; x < grid[0].length; x++) {
for (let y = 0; y < grid[x].length; y++) {
yield {x, y};
}
}
}
function* enumerateNeighbours(grid, x, y) {
for (const p of [{x:-1,y:0},{x:0,y:-1},{x:1,y:0},{x:0,y:1}]) {
if (grid[x+p.x] && grid[x+p.x][y+p.y]) {
yield {x: x+p.x, y: y+p.y};
}
}
}
function visit(grid, x, y) {
grid[x][y] = "V";
for (const n of enumerateNeighbours(grid, x, y)) {
if (grid[n.x] && grid[n.x][n.y] === "P") {
visit(grid, n.x, n.y);
}
}
}
function numOfPlanes(grid) {
let planesCount = 0;
for (const p of enumerateGrid(grid)) {
if (grid[p.x][p.y] === "P") {
planesCount++;
visit(grid, p.x, p.y);
}
}
return planesCount;
}
You iterate over the grid cells. Each time you hit a “plane” cell, increment the counter, then recursively mark it and all its neighbouring “plane” cells as visited.