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];
Queue<Integer> q = new LinkedList<>();
int node = sr * c + sc;
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;
for(int d = 0 ; d < 4 ; d ++){
int nnr = cnr + dir[d][0];
int nnc = cnc + dir[d][1];
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;
}
}