# LC 827. Making A Large Island
### [Problem link](https://leetcode.com/problems/making-a-large-island/)
###### tags: `leedcode` `hard` `c++` `DFS`
You are given an <code>n x n</code> binary matrix <code>grid</code>. You are allowed to change **at most one** <code>0</code> to be <code>1</code>.
Return the size of the largest **island** in <code>grid</code> after applying this operation.
An **island** is a 4-directionally connected group of <code>1</code>s.
**Example 1:**
```
Input: grid = [[1,0],[0,1]]
Output: 3
Explanation: Change one 0 to 1 and connect two 1s, then we get an island with area = 3.
```
**Example 2:**
```
Input: grid = [[1,1],[1,0]]
Output: 4
Explanation: Change the 0 to 1 and make the island bigger, only one island with area = 4.
```
**Example 3:**
```
Input: grid = [[1,1],[1,1]]
Output: 4
Explanation: Can't change any 0 to 1, only one island with area = 4.
```
**Constraints:**
- <code>n == grid.length</code>
- <code>n == grid[i].length</code>
- <code>1 <= n <= 500</code>
- <code>grid[i][j]</code> is either <code>0</code> or <code>1</code>.
## Solution 1 - DFS
#### C++
```cpp=
class Solution {
public:
int dfs(vector<vector<int>>& grid, int x, int y, int idx) {
int n = grid.size();
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
grid[x][y] = idx;
int area = 1;
for (int i = 0; i < 4; i++) {
int newX = x + dir[i][0];
int newY = y + dir[i][1];
if (0 <= newX && newX < n && 0 <= newY && newY < n && grid[newX][newY] == 1) {
area += dfs(grid, newX, newY, idx);
}
}
return area;
}
int largestIsland(vector<vector<int>>& grid) {
int n = grid.size();
unordered_map<int, int> umap;
int idx = 2;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
int area = dfs(grid, i, j, idx);
umap[idx] = area;
idx++;
}
}
}
int res = 0;
for (auto& p: umap) {
res = max(res, p.second);
}
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 0) {
int tmp = 1;
unordered_set<int> r;
for (int k = 0; k < 4; k++) {
int newX = i + dir[k][0];
int newY = j + dir[k][1];
if (0 <= newX && newX < n && 0 <= newY && newY < n && r.find(grid[newX][newY]) == r.end()) {
tmp += umap[grid[newX][newY]];
r.insert(grid[newX][newY]);
}
}
res = max(res, tmp);
}
}
}
return res;
}
};
```
>### Complexity
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(n^2) | O(n^2) |
## Note
x