#733.Flood Fill [LeetCode Grind 75 in Java]

[Problem Link] https://leetcode.com/problems/flood-fill/

class Solution {
    public int[][] dir = {{0,1} , {0,-1} , {1,0} , {-1,0}};

    public int[][] floodFill(int[][] image, int sr, int sc, int color) {
        int r = image.length;
        int c = image[0].length;
        boolean[] vis = new boolean[r * c];

        //BFS traversal from source node
        Queue<Integer> q = new LinkedList<>();
        int node = sr * c + sc; //trick to store 2D values in 1D manner
        q.add(node);
        int srcolor = image[sr][sc];
        image[sr][sc] = color;

        while(!q.isEmpty()){
            int sz = q.size();
            while(sz -- > 0){
                int cn = q.poll();
                int cnr = cn / c;
                int cnc = cn % c;
                vis[cn] = true;

                // check next node in all the 4 directions
                for(int d = 0 ; d < 4 ; d ++){
                    int nnr = cnr + dir[d][0];
                    int nnc = cnc + dir[d][1];

                    //Boundary check
                    if(nnr >= 0 && nnr < r && nnc >= 0 && nnc < c){
                        int nn = nnr * c + nnc;
                        if(!vis[nn] && image[nnr][nnc] == srcolor){
                            image[nnr][nnc] = color;
                            q.add(nn);
                        } 
                    }
                }
            }
        }
        return image;   
    }
}