Learn how to solve the flood fill algorithm in javascript.
Flood fill also called as seed fill is an algorithm to determine the area connected to the given node in a multi-dimensional array.
The most common use of this is to use it as a bucket to fill connected, same colored areas in the painting apps Or in the images to replace the pixels with same color.
Example
Input: const arr = [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 2, 2, 2, 0, 0, 0], [0, 0, 0, 2, 2, 0, 0, 0], [0, 0, 0, 2, 2, 2, 2, 0], [0, 0, 0, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 2, 2, 0], ] //Replace all all the similar pixels at arr[3][3] with 3. //Which is basically replace all 2 with 3. Output: [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 3, 3, 3, 3, 0, 0, 0], [0, 0, 0, 3, 3, 0, 0, 0], [0, 0, 0, 3, 3, 3, 3, 0], [0, 0, 0, 0, 0, 3, 0, 0], [0, 0, 0, 0, 0, 3, 3, 0], ]
Flood fill algorithm in javascript.
The flood fill algorithms works by replacing all the similar elements 4-directionally. Above, below, before, after and plus any pixels connected to those in all the directions.
Implementation
- We will create a function which will fill the color by calling itself recursively in all the 4-directions.
- But before that check if the input to be replaced and the new input are same or not.
- If they are same then return the original array because it will result in infinite loop.
- Otherwise check all the boundaries and fill the color only if it is within the bound and is not different input.
const floodFill = (image, sr, sc, newColor) => {
//Get the input which needs to be replaced.
const current = image[sr][sc];
//If the newColor is same as the existing
//Then return the original image.
if(current === newColor){
return image;
}
//Other wise call the fill function which will fill in the existing image.
fill(image, sr, sc, newColor, current);
//Return the image once it is filled
return image;
};
const fill = (image, sr, sc, newColor, current) => {
//If row is less than 0
if(sr < 0){
return;
}
//If column is less than 0
if(sc < 0){
return;
}
//If row is greater than image length
if(sr > image.length - 1){
return;
}
//If column is greater than image length
if(sc > image[sr].length - 1){
return;
}
//If the current pixel is not which needs to be replaced
if(image[sr][sc] !== current){
return;
}
//Update the new color
image[sr][sc] = newColor;
//Fill in all four directions
//Fill Prev row
fill(image, sr - 1, sc, newColor, current);
//Fill Next row
fill(image, sr + 1, sc, newColor, current);
//Fill Prev col
fill(image, sr, sc - 1, newColor, current);
//Fill next col
fill(image, sr, sc + 1, newColor, current);
}
Input: console.log(floodFill([[1,1,1],[1,1,0],[1,0,1]], 0, 1, 2)); Output: [[2,2,2],[2,2,0],[2,0,1]]
Time complexity of flood fill algorithm.
As we have to update the array in all the 4 – directions, each function call will run in O(M * N) where M is the numbers of rows and N is the number of columns and we are calling the 4 times recursively so the time complexity is O(4 * M * N) = O(M * N).
Space complexity.
Same goes for space complexity each function call will make 4 function calls for all the rows and columns so it will be O(4 * M * N) = O(M * N).