function traverse(r, c, grid, visited, fn, id = true) {
const [nRows, nCols] = [grid.length, grid[0].length];
const z = grid[r][c];
visited[r][c] = id;
return (
fn(r, c, grid) +
(r > 0 && grid[r - 1][c] === z && !visited[r - 1][c]
? traverse(r - 1, c, grid, visited, fn, id)
: 0) +
(c > 0 && grid[r][c - 1] === z && !visited[r][c - 1]
? traverse(r, c - 1, grid, visited, fn, id)
: 0) +
(r < nRows - 1 && grid[r + 1][c] === z && !visited[r + 1][c]
? traverse(r + 1, c, grid, visited, fn, id)
: 0) +
(c < nCols - 1 && grid[r][c + 1] === z && !visited[r][c + 1]
? traverse(r, c + 1, grid, visited, fn, id)
: 0)
);
}