import java.util.*;
class Solution {
static int[][] dir={{0,1},{0,-1},{1,0},{-1,0}};
static boolean[][] visit;
public int[] solution(int m, int n, int[][] picture) {
int numberOfArea = 0;
int maxSizeOfOneArea = 0;
visit=new boolean[m][n];
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(picture[i][j] !=0 && !visit[i][j]){
maxSizeOfOneArea=Math.max(maxSizeOfOneArea,bfs(m,n,i,j,picture));
numberOfArea++;}
}
}
return new int[]{numberOfArea, maxSizeOfOneArea};
}
public int bfs(int m, int n, int x, int y, int[][] picture){
int range=1;
Queue<Integer> q=new LinkedList<>();
q.add(x);
q.add(y);
visit[x][y]=true;
while(!q.isEmpty()){
x=q.poll();
y=q.poll();
for(int k=0; k<4; k++){
int nx=x+dir[k][0];
int ny=y+dir[k][1];
if(nx<0 || ny<0 || nx>=m || ny>=n) continue;
if(visit[nx][ny]) continue;
if(picture[x][y] !=picture[nx][ny]) continue;
q.add(nx);
q.add(ny);
visit[nx][ny]=true;
range++;
}
}
return range;
}
}