C Program
#include <stdio.h>
int img[3][3] = {{1,1,0}, {1,0,0}, {1,1,0}}, r = 3, c = 3;
void fill(int x, int y, int old, int new) {
if (x<0 || y<0 || x>=r || y>=c || img[x][y]!=old) return;
img[x][y] = new;
fill(x+1,y,old,new); fill(x-1,y,old,new); fill(x,y+1,old,new); fill(x,y-1,old,new);
}
int main() {
fill(0,0,1,2);
for(int i=0;i<r;i++,puts(""))
for(int j=0;j<c;j++) printf("%d ", img[i][j]);
}C Output
Input: Start: (0,0), Old Color: 1, New Color: 2 Output: 2 2 0 2 0 0 2 2 0
C++ Program
#include <iostream>
using namespace std;
int img[3][3] = {{1,1,1},{1,1,0},{1,0,1}}, r=3, c=3;
void fill(int x, int y, int old, int n) {
if(x<0||y<0||x>=r||y>=c||img[x][y]!=old) return;
img[x][y] = n;
fill(x+1,y,old,n); fill(x-1,y,old,n); fill(x,y+1,old,n); fill(x,y-1,old,n);
}
int main() {
fill(1,1,1,9);
for(int i=0;i<r;i++,cout<<'\n')
for(int j=0;j<c;j++) cout<<img[i][j]<<" ";
}C++ Output
Input: Start: (1,1), Old Color: 1, New Color: 9 Output: 9 9 9 9 9 0 9 0 1
JAVA Program
import java.util.*;
class Main {
static int[][] img = {{0,0,0},{0,1,1},{1,1,0}};
static void fill(int x, int y, int old, int n) {
if(x<0||y<0||x>=3||y>=3||img[x][y]!=old) return;
img[x][y]=n;
fill(x+1,y,old,n); fill(x-1,y,old,n); fill(x,y+1,old,n); fill(x,y-1,old,n);
}
public static void main(String[] args) {
fill(1,1,1,7);
for(int[] row : img) System.out.println(Arrays.toString(row));
}
}JAVA Output
Input: Start: (1,1), Old Color: 1, New Color: 7 Output: [0, 0, 0] [0, 7, 7] [7, 7, 0]
Python Program
img = [[1,1,1],[1,1,0],[0,0,1]]
def fill(x, y, old, new):
if x<0 or y<0 or x>=3 or y>=3 or img[x][y]!=old: return
img[x][y] = new
for dx,dy in ((1,0),(-1,0),(0,1),(0,-1)): fill(x+dx, y+dy, old, new)
fill(0,0,1,5)
for row in img: print(row)Python Output
Input: Start: (0,0), Old Color: 1, New Color: 5 Output: [5, 5, 5] [5, 5, 0] [0, 0, 1]
In-Depth Explanation
Example
In C++ version, the image is:
1 1 1
1 1 0
1 0 1
We start at (1,1) and replace 1 by 9 in all directions that are 4-connected.
It converts all adjacent 1's to 9 until it reaches 0's or the edge.
Real-Life Analogy
Consider a paint bucket tool of MS Paint. When you click at a point, it fills the whole connected area of the same color.
That's flood fill — a restricted spreading of color from a single pixel to all equivalent, surrounding pixels.
Another illustration: spreading fire in a forest simulation, where each surrounding tree is ignited from the central one.
Why It Matters
Flood fill finds application in:
Paint programs and image editors
Region detection in 2D grids
Maze-solving and game maps
Grid-based simulations such as virus spread or game of life
It's also an excellent means to perform DFS/BFS on 2D problems, enhancing insight into connected components.
Learning Insights
Flood fill shows you:
How recursion can spread in 2D space
How to manage spreading using base cases
A different way of viewing depth-first search in a matrix
That matrix/grid problems are disguised graphs
It also reinforces your understanding of problem boundaries, depth of recursion, and space exploration optimization.
Interview & Real-World Use
In interviews, flood fill is included in:
Island counting issues
Coloring maps and regions
Pixel replacement
Zone detecting in simulation
Applied in real-world:
Image processing programs
Medical image analysis
Territory games
Map processing tools
The flood fill algorithm is a fundamental recursive technique for dealing with connected areas within grids. Whether you're implementing color fill in graphics editors, island counting in coding problems, or creating map analyzers for real-world maps, this algorithm assists you in recursively or iteratively accessing all similar, adjacent units. With the brief implementations in C, C++, Java, and Python and simple explanation with real-world applications from this guide, you'll be well prepared to grasp, implement, and explain flood fill professionally in interviews as well as real-world projects.

Social Plugin