From 495354128260b1d053d9883f64917f5f29ce44a6 Mon Sep 17 00:00:00 2001 From: Satvik-Singh192 Date: Fri, 7 Nov 2025 15:32:16 +0530 Subject: [PATCH] feat: implemented flood fill recursion algorthim --- src/algorithms/Recursion/FloodFill.js | 18 ++++ src/components/Recursion/FloodFill.jsx | 142 +++++++++++++++++++++++++ src/pages/Recursion/FloodFill.jsx | 10 ++ src/pages/Recursion/RecursionPage.jsx | 9 +- 4 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/Recursion/FloodFill.js create mode 100644 src/components/Recursion/FloodFill.jsx create mode 100644 src/pages/Recursion/FloodFill.jsx diff --git a/src/algorithms/Recursion/FloodFill.js b/src/algorithms/Recursion/FloodFill.js new file mode 100644 index 0000000..295ce98 --- /dev/null +++ b/src/algorithms/Recursion/FloodFill.js @@ -0,0 +1,18 @@ +export function floodFill(mat, x, y, targetColor, newColor, steps = []) { + const rows = mat.length; + const cols = mat[0].length; + + if (x < 0 || y < 0 || x >= rows || y >= cols) return; + if (mat[x][y] !== targetColor) return; + + steps.push({ x, y }); + + mat[x][y] = newColor; + + floodFill(mat, x + 1, y, targetColor, newColor, steps); + floodFill(mat, x - 1, y, targetColor, newColor, steps); + floodFill(mat, x, y + 1, targetColor, newColor, steps); + floodFill(mat, x, y - 1, targetColor, newColor, steps); + + return steps; +} diff --git a/src/components/Recursion/FloodFill.jsx b/src/components/Recursion/FloodFill.jsx new file mode 100644 index 0000000..81b0e3d --- /dev/null +++ b/src/components/Recursion/FloodFill.jsx @@ -0,0 +1,142 @@ +import React, { useState } from "react"; +import { floodFill } from "@/algorithms/Recursion/FloodFill"; +export default function FloodFillVisualizer() { + const rows = 20; + const cols = 20; + + const generateGrid = () => { + const grid = []; + for (let i = 0; i < rows; i++) { + const row = []; + for (let j = 0; j < cols; j++) { + row.push(Math.random() > 0.3 ? 1 : 0); + } + grid.push(row); + } + return grid; + }; + + const [grid, setGrid] = useState(generateGrid()); + const [speed, setSpeed] = useState(200); + const [isRunning, setIsRunning] = useState(false); + + const source = { x: 0, y: 0 }; + + const startFloodFill = () => { + if (isRunning) return; + + const mat = grid.map((row) => [...row]); + const steps = []; + floodFill(grid.map((row) => [...row]), source.x, source.y, 1, 2, steps); + + animateFill(steps); + }; + + const animateFill = (steps) => { + let i = 0; + setIsRunning(true); + + const interval = setInterval(() => { + if (i >= steps.length) { + clearInterval(interval); + setIsRunning(false); + return; + } + + const { x, y } = steps[i]; + setGrid((prev) => { + const newGrid = prev.map((row) => [...row]); + newGrid[x][y] = 2; + return newGrid; + }); + + i++; + }, speed); + }; + + return ( +
+

Recursive Flood Fill Visualization

+
+ + setSpeed(Number(e.target.value))} + style={{ width: "300px" }} + /> +
{speed} ms per step
+
+
+ {grid.map((row, r) => + row.map((cell, c) => { + let color = "#dfe6e9"; + + if (r === source.x && c === source.y) { + color = "#ff7675"; + } else if (cell === 2) { + color = "#3498db"; + } else if (cell === 1) { + color = "#b2bec3"; + } + + return ( +
+ ); + }) + )} +
+
+ + + +
+
+ ); +} diff --git a/src/pages/Recursion/FloodFill.jsx b/src/pages/Recursion/FloodFill.jsx new file mode 100644 index 0000000..975cf39 --- /dev/null +++ b/src/pages/Recursion/FloodFill.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import FloodFillVisualizer from "@/components/Recursion/FloodFill"; + +export default function FloodFillPage() { + return ( +
+ +
+ ); +} diff --git a/src/pages/Recursion/RecursionPage.jsx b/src/pages/Recursion/RecursionPage.jsx index e48c385..1053409 100644 --- a/src/pages/Recursion/RecursionPage.jsx +++ b/src/pages/Recursion/RecursionPage.jsx @@ -5,6 +5,7 @@ import NQueens from "./NQueens"; import Sudoku from "./sudokuSolver"; import TowerOfHanoi from "./towerOfHanoi"; import SubsetSum from "./SubsetSum"; +import FloodFillPage from "./FloodFill"; export default function RecursionPage() { const [selectedAlgo, setSelectedAlgo] = useState(""); const [sidebarOpen, setSidebarOpen] = useState(true); @@ -41,7 +42,12 @@ export default function RecursionPage() {
); - + case "FloodFill": + return( +
+ +
+ ) default: return (
@@ -87,6 +93,7 @@ export default function RecursionPage() { +