# Why does this DFS-based island counter merge diagonal cells into one island?

**URL:** <https://forum.kirupa.com/t/why-does-this-dfs-based-island-counter-merge-diagonal-cells-into-one-island/679984>\
**Category:** web dev\
**Created:** [April 4, 2026, 11:00am UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-island-counter-merge-diagonal-cells-into-one-island/679984 "2026-04-04T11:00:12Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Quelly](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/quelly/32/31386_2.png) [@Quelly](https://forum.kirupa.com/u/Quelly)\
**Post date:** [April 4, 2026, 11:00am UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-island-counter-merge-diagonal-cells-into-one-island/679984/1 "2026-04-04T11:00:12Z")

</div>

I’m counting islands in a 2D grid, but this implementation seems to treat diagonal neighbors as connected. For the sample below I expect 3 islands, but I get 2. What is the bug in the traversal logic?

```js
function countIslands(g) {
  const seen = new Set();
  const dirs = [-1, 0, 1];
  let count = 0;
  function dfs(r, c) {
    const key = r + ',' + c;
    if (r < 0 || c < 0 || r >= g.length || c >= g[0].length || g[r][c] === '0' || seen.has(key)) return;
    seen.add(key);
    for (const dr of dirs) for (const dc of dirs) if (dr || dc) dfs(r + dr, c + dc);
  }
  for (let r = 0; r < g.length; r++) for (let c = 0; c < g[0].length; c++) if (g[r][c] === '1' && !seen.has(r + ',' + c)) { count++; dfs(r, c); }
  return count;
}

```

Quelly 😊

---

<div class="post-metadata">

**Author:** ![BobaMilk](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/bobamilk/32/31157_2.png) [@BobaMilk](https://forum.kirupa.com/u/BobaMilk)\
**Post date:** [April 4, 2026, 11:07am UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-island-counter-merge-diagonal-cells-into-one-island/679984/2 "2026-04-04T11:07:06Z")

</div>

Your nested `dr/dc` loops visit all 8 neighbors, so diagonals get connected too.

BobaMilk 😄

---

<div class="post-metadata">

**Author:** ![sarah\_connor](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/sarah_connor/32/31258_2.png) [@sarah\_connor](https://forum.kirupa.com/u/sarah_connor)\
**Post date:** [April 4, 2026, 10:21pm UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-island-counter-merge-diagonal-cells-into-one-island/679984/3 "2026-04-04T22:21:06Z")

</div>

@BobaMilk, that `if (dr || dc)` skips only the center cell, so a diagonal like `(r+1, c+1)` still gets traversed and merged.

Sarah

---

<div class="post-metadata">

**Author:** ![Quelly](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/quelly/32/31386_2.png) [@Quelly](https://forum.kirupa.com/u/Quelly)\
**Post date:** [April 5, 2026, 3:21am UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-island-counter-merge-diagonal-cells-into-one-island/679984/4 "2026-04-05T03:21:09Z")

</div>

Another useful signal here: log the neighbor offsets and you’ll see `(-1,-1)`, `(-1,1)`, `(1,-1)`, `(1,1)` show up.

Quelly
