Giả sử chúng ta có một lưới 2D gồm các giá trị nhị phân (0 và 1), chúng ta thay đổi nhiều nhất từ 0 đến 1. Sau đó, chúng ta phải tìm kích thước của hòn đảo lớn nhất. ? Đây là một hòn đảo là một nhóm 1 được kết nối 4 hướng (trên, dưới, trái, phải).
Vì vậy, nếu đầu vào giống như [[1, 0], [0, 1]], thì đầu ra sẽ là 3, điều này là do nếu chúng ta thay đổi một 0 thành 1 và kết nối hai số 1, thì chúng ta sẽ nhận được một đảo với diện tích =3.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định dir mảng có kích thước:4 x 2, dir:={{1, 0}, {- 1, 0}, {0, 1}, {0, - 1}}
-
Xác định một hàm dfs (), hàm này sẽ lấy idx, i, j, lưới,
-
nếu (i, j) nằm trong vùng lưới và lưới [i, j] không bằng 1, thì -
-
trả về 0
-
-
ret:=1
-
lưới [i, j]:=idx
-
để khởi tạo k:=0, khi k <4, cập nhật (tăng k lên 1), thực hiện -
-
ni:=dir [k, 0] + i, nj:=dir [k, 1] + j
-
ret:=ret + dfs (lưới, ni, nj, idx)
-
-
trả lại ret
-
Từ phương thức chính, thực hiện như sau -
-
ret:=0, idx:=2
-
Xác định một vùng có kích thước 2
-
n:=Số hàng của lưới, m:=số cột của lưới
-
để khởi tạo i:=0, khi i
-
để khởi tạo j:=0, khi j
-
nếu lưới [i, j] giống 1, thì -
-
chèn dfs (lưới, i, j, idx) vào cuối vùng
-
ret:=tối đa ret và phần tử cuối cùng của khu vực
-
(tăng idx lên 1)
-
-
-
-
để khởi tạo i:=0, khi i
-
nếu lưới [i, j] giống 0, thì -
-
Xác định một bộ idxs
-
để khởi tạo k:=0, khi k <4, cập nhật (tăng k lên 1), thực hiện -
-
ni:=i + dir [k, 0], nj:=j + dir [k, 1]
-
nếu ni, nj trong phạm vi lưới, thì -
-
nếu lưới [ni, nj] khác 0 thì -
-
chèn lưới [ni, nj] vào idxs
-
-
-
-
tạm thời:=1
-
đối với tất cả các phần tử nó trong idxs, do -
-
temp:=temp + area [it]
-
(tăng nó lên 1) p + area [it]
-
-
-
ret:=tối đa ret và tạm thời
-
-
trả lại ret
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h> using namespace std; int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; class Solution { public: int dfs(vector < vector <int> >& grid, int i, int j, int idx){ if(i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size() || grid[i][j] != 1) return 0; int ret = 1; grid[i][j] = idx; for(int k = 0; k < 4; k++){ int ni = dir[k][0] + i; int nj = dir[k][1] + j; ret += dfs(grid, ni, nj, idx); } return ret; } int largestIsland(vector<vector<int>>& grid) { int ret = 0; int idx = 2; vector <int > area(2); int n = grid.size(); int m = grid[0].size(); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(grid[i][j] == 1){ area.push_back(dfs(grid, i, j, idx)); ret = max(ret, area.back()); idx++; } } } for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(grid[i][j] == 0){ set <int> idxs; for(int k = 0; k < 4; k++){ int ni = i + dir[k][0]; int nj = j + dir[k][1]; if(ni < 0 || nj < 0 || ni >= grid.size() || nj >= grid[0].size()) continue; if(grid[ni][nj]){ idxs.insert(grid[ni][nj]); } } int temp = 1; set <int> :: iterator it = idxs.begin(); while(it != idxs.end()){ temp += area[*it]; it++; } ret = max(ret, temp); } } } return ret; } }; main(){ Solution ob; vector<vector<int>> v = {{1,0},{0,1}}; cout << (ob.largestIsland(v)); }
Đầu vào
{{1,0},{0,1}}
Đầu ra
3