class Solution {
public:
int m = 0 , n = 0;
int dir[4][2] = {0,-1,0,1,-1,0,1,0};
int tmp_sum = 1 , bolck_num = 1;
void dfs(vector<vector<int>>& grid ,vector<vector<bool>> &path , int x ,int y ,int num )
{
for(int i=0 ; i<4 ;i++)
{
int next_x = x + dir[i][0];
int next_y = y + dir[i][1];
if(next_x<0||next_x>=m||next_y<0||next_y>=n) continue;
if(grid[next_x][next_y] == 1 && path[next_x][next_y] == false)
{
tmp_sum++;
grid[next_x][next_y] = num;
dfs(grid,path,next_x,next_y,num);
}
}
}
int largestIsland(vector<vector<int>>& grid) {
m = grid.size();
n = grid[0].size();
vector<vector<bool>> path(m,vector<bool>(n,false));
map<int,int> my_map;
for(int i=0 ; i<m ;i++)
{
for(int j=0 ; j<n ;j++)
{
if(grid[i][j] == 1 && path[i][j] == false)
{
bolck_num++;
path[i][j] = true;
grid[i][j] = bolck_num;
tmp_sum=1;
dfs(grid,path,i,j,bolck_num);
my_map[bolck_num] = tmp_sum;
}
}
}
int result = 0 , tmp_result = 1;
for(int i=0 ; i<m ;i++)
{
for(int j=0 ; j<n ;j++)
{
if(grid[i][j] == 0 && path[i][j] == false)
{
path[i][j] = true;
tmp_result = 1;
set<int> my_set;
for(int k=0 ; k<4 ;k++)
{
int next_x = i + dir[k][0];
int next_y = j + dir[k][1];
if(next_x<0||next_x>=m||next_y<0||next_y>=n) continue;
if(grid[next_x][next_y] != 0 ) my_set.insert(grid[next_x][next_y]);
}
for(auto it = my_set.begin() ; it!=my_set.end();it++) tmp_result += my_map[*it];
my_set.clear();
if(tmp_result > result) result = tmp_result;
}
}
}
if(result == 0) return m*n;
return result;
}
};