-
Notifications
You must be signed in to change notification settings - Fork 73
/
Distinct Number Of Islands in 2D Matrix
82 lines (65 loc) · 1.7 KB
/
Distinct Number Of Islands in 2D Matrix
1
2
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
// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
// 2D array for the storing the horizontal and vertical
// directions. (Up, left, down, right}
vector<vector<int> > dirs = { { 0, -1 },
{ -1, 0 },
{ 0, 1 },
{ 1, 0 } };
// Function to perform dfs of the input grid
void dfs(vector<vector<int> >& grid, int x0, int y0,
int i, int j, vector<pair<int, int> >& v)
{
int rows = grid.size(), cols = grid[0].size();
if (i < 0 || i >= rows || j < 0
|| j >= cols || grid[i][j] <= 0)
return;
// marking the visited element as -1
grid[i][j] *= -1;
// computing coordinates with x0, y0 as base
v.push_back({ i - x0, j - y0 });
// repeat dfs for neighbors
for (auto dir : dirs) {
dfs(grid, x0, y0, i + dir[0], j + dir[1], v);
}
}
// Main function that returns distinct count of islands in
// a given boolean 2D matrix
int countDistinctIslands(vector<vector<int> >& grid)
{
int rows = grid.size();
if (rows == 0)
return 0;
int cols = grid[0].size();
if (cols == 0)
return 0;
set<vector<pair<int, int> > > coordinates;
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
// If a cell is not 1
// no need to dfs
if (grid[i][j] != 1)
continue;
// vector to hold coordinates
// of this island
vector<pair<int, int> > v;
dfs(grid, i, j, i, j, v);
// insert the coordinates for
// this island to set
coordinates.insert(v);
}
}
return coordinates.size();
}
// Driver code
int main()
{
vector<vector<int> > grid = { { 1, 1, 0, 1, 1 },
{ 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1 },
{ 1, 1, 0, 1, 1 } };
cout << "Number of distinct islands is "
<< countDistinctIslands(grid);
return 0;
}