| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 
 | class Solution {private:
 struct Island {
 int area;
 int index;
 Island(int a, int i):area(a), index(i) {}
 };
 bool edgeMap[505][505];
 Island* islandMap[505][505];
 
 int n;
 public:
 int largestIsland(vector<vector<int>>& grid) {
 n = grid.size();
 int island_count = 0;
 bool find0 = false;
 bool find1 = false;
 for(int i = 0; i < n; i++) {
 for(int j = 0; j < n; j++) {
 if(grid[i][j] == 1) {
 find1 = true;
 Island *island = nullptr;
 if(islandMap[i][j] == nullptr) {
 island = new Island(0, island_count++);
 dfs(grid, i, j, island);
 } else {
 island = islandMap[i][j];
 }
 
 if(j-1 >= 0 && grid[i][j-1] == 0) {
 edgeMap[i][j-1] = true;
 }
 if(i-1 >= 0 && grid[i-1][j] == 0) {
 edgeMap[i-1][j] = true;
 }
 
 } else {
 find0 = true;
 Island *island = nullptr;
 if(j-1 >= 0 && grid[i][j-1] == 1) {
 edgeMap[i][j] = true;
 }
 if(i-1 >= 0 && grid[i-1][j] == 1) {
 edgeMap[i][j] = true;
 }
 }
 }
 }
 
 int max2area = 0;
 if(!find0 && find1) return n*n;
 if(find0 && !find1) return 1;
 for(int i = 0; i < n; i++) {
 for(int j = 0; j < n; j++) {
 set<Island*> neighbour;
 int areai = 1;
 
 if(edgeMap[i][j]) {
 if(j-1 >= 0 && grid[i][j-1] == 1) {
 Island *island = islandMap[i][j-1];
 neighbour.insert(island);
 }
 if(i-1 >= 0 && grid[i-1][j] == 1) {
 Island *island = islandMap[i-1][j];
 neighbour.insert(island);
 }
 if(j+1 < n && grid[i][j+1] == 1) {
 Island *island = islandMap[i][j+1];
 neighbour.insert(island);
 }
 if(i+1 < n && grid[i+1][j] == 1) {
 Island *island = islandMap[i+1][j];
 neighbour.insert(island);
 }
 for(set<Island*>::iterator ite = neighbour.begin(); ite != neighbour.end(); ite++) {
 areai += (*ite)->area;
 }
 
 max2area = max2area > areai ? max2area : areai;
 }
 
 }
 }
 return max2area;
 
 }
 
 void addDot(int x, int y) {
 edgeMap[x][y] = true;
 }
 
 void dfs(vector<vector<int>>& grid, int x, int y, Island *island) {
 if(islandMap[x][y] != nullptr) return;
 islandMap[x][y] = island;
 island->area++;
 
 if(y-1 >= 0 && grid[x][y-1] == 1) {
 dfs(grid, x, y-1, island);
 }
 if(y+1 < n && grid[x][y+1] == 1) {
 dfs(grid, x, y+1, island);
 }
 if(x+1 < n && grid[x+1][y] == 1) {
 dfs(grid, x+1, y, island);
 }
 if(x-1 >= 0 && grid[x-1][y] == 1) {
 dfs(grid, x-1, y, island);
 }
 }
 };
 
 |