Files
wehub-resource-sync dde272c4b8
i18n - Build Validation / Validate i18n Builds (24) (push) Has been cancelled
CI - Node.js / Lint (24) (push) Has been cancelled
CI - Node.js / Build (24) (push) Has been cancelled
CI - Node.js / Test (24) (push) Has been cancelled
CI - Node.js / Test - Upcoming Changes (24) (push) Has been cancelled
CI - Node.js / Test - i18n (italian, 24) (push) Has been cancelled
CI - Node.js / Test - i18n (portuguese, 24) (push) Has been cancelled
CD - Docker - GHCR Images / Build and Push Images (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:55:53 +08:00

2.4 KiB

id, title, challengeType, dashedName
id title challengeType dashedName
6a26df95efa55a2524399744 Challenge 363: Bucket Fill 2 28 challenge-363

--description--

Given a 2D grid of single-letter color strings and a target color, return the minimum number of flood fill "clicks" needed to make the entire grid the target color.

  • Each click changes the clicked cell's color and the entire region of connected cells of the same color with the target color.
  • Cells are connected horizontally and vertically (not diagonally).

--hints--

bucketFill([["R", "R"], ["R", "R"]], "G") should return 1.

assert.equal(bucketFill([["R", "R"], ["R", "R"]], "G"), 1);

bucketFill([["B", "B", "B"], ["B", "B", "B"], ["B", "B", "B"]], "B") should return 0.

assert.equal(bucketFill([["B", "B", "B"], ["B", "B", "B"], ["B", "B", "B"]], "B"), 0);

bucketFill([["G", "Y", "Y"], ["G", "Y", "G"], ["Y", "Y", "G"]], "R") should return 3.

assert.equal(bucketFill([["G", "Y", "Y"], ["G", "Y", "G"], ["Y", "Y", "G"]], "R"), 3);

bucketFill([["G", "G", "P", "Y"], ["O", "P", "P", "P"], ["O", "O", "P", "G"], ["G", "O", "O", "G"]], "P") should return 5.

assert.equal(bucketFill([["G", "G", "P", "Y"], ["O", "P", "P", "P"], ["O", "O", "P", "G"], ["G", "O", "O", "G"]], "P"), 5);

bucketFill([["G", "G", "C", "C", "O"], ["B", "Y", "B", "Y", "O"], ["B", "J", "O", "J", "B"], ["G", "Y", "Y", "Y", "B"], ["G", "P", "P", "G", "G"]], "Y") should return 12.

assert.equal(bucketFill([["G", "G", "C", "C", "O"], ["B", "Y", "B", "Y", "O"], ["B", "J", "O", "J", "B"], ["G", "Y", "Y", "Y", "B"], ["G", "P", "P", "G", "G"]], "Y"), 12);

--seed--

--seed-contents--

function bucketFill(grid, targetColor) {

  return grid;
}

--solutions--

function bucketFill(grid, targetColor) {
  const rows = grid.length;
  const cols = grid[0].length;
  const visited = new Set();

  function dfs(r, c, color) {
    const key = `${r},${c}`;
    if (r < 0 || r >= rows || c < 0 || c >= cols) return;
    if (visited.has(key)) return;
    if (grid[r][c] !== color) return;
    visited.add(key);
    dfs(r + 1, c, color);
    dfs(r - 1, c, color);
    dfs(r, c + 1, color);
    dfs(r, c - 1, color);
  }

  let clicks = 0;
  for (let r = 0; r < rows; r++) {
    for (let c = 0; c < cols; c++) {
      const key = `${r},${c}`;
      if (!visited.has(key) && grid[r][c] !== targetColor) {
        dfs(r, c, grid[r][c]);
        clicks++;
      }
    }
  }

  return clicks;
}