// C++ Program to count islands in boolean 2D matrix
#include <bits/stdc++.h>
using namespace std;
#define ROW 5
#define COL 5
// A function to check if a given
// cell (row, col) can be included in DFS
int isSafe(int M[][COL], int row, int col,
bool visited[][COL])
{
// row number is in range, column
// number is in range and value is 1
// and not yet visited
return (row >= 0) && (row < ROW) && (col >= 0) && (col < COL) && (M[row][col] && !visited[row][col]);
}
// A utility function to do DFS for a
// 2D boolean matrix. It only considers
// the 8 neighbours as adjacent vertices
void DFS(int M[][COL], int row, int col,
bool visited[][COL])
{
// These arrays are used to get
// row and column numbers of 8
// neighbours of a given cell
static int rowNbr[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
static int colNbr[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
// Mark this cell as visited
visited[row][col] = true;
// Recur for all connected neighbours
for (int k = 0; k < 8; ++k)
if (isSafe(M, row + rowNbr[k], col + colNbr[k], visited))
DFS(M, row + rowNbr[k], col + colNbr[k], visited);
}
// The main function that returns
// count of islands in a given boolean
// 2D matrix
int countIslands(int M[][COL])
{
// Make a bool array to mark visited cells.
// Initially all cells are unvisited
bool visited[ROW][COL];
memset(visited, 0, sizeof(visited));
// Initialize count as 0 and
// travese through the all cells of
// given matrix
int count = 0;
for (int i = 0; i < ROW; ++i)
for (int j = 0; j < COL; ++j)
// If a cell with value 1 is not
if (M[i][j] && !visited[i][j]) {
// visited yet, then new island found
// Visit all cells in this island.
DFS(M, i, j, visited);
// and increment island count
++count;
}
return count;
}
// Driver code
int main()
{
int M[][COL] = { { 1, 1, 0, 0, 0 },
{ 0, 1, 0, 0, 1 },
{ 1, 0, 0, 1, 1 },
{ 0, 0, 0, 0, 0 },
{ 1, 0, 1, 0, 1 } };
cout << "Number of islands is: " << countIslands(M);
return 0;
}
// This is code is contributed by rathbhupendra
Ly8gQysrIFByb2dyYW0gdG8gY291bnQgaXNsYW5kcyBpbiBib29sZWFuIDJEIG1hdHJpeCAKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCiNkZWZpbmUgUk9XIDUgCiNkZWZpbmUgQ09MIDUgCgovLyBBIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgZ2l2ZW4gCi8vIGNlbGwgKHJvdywgY29sKSBjYW4gYmUgaW5jbHVkZWQgaW4gREZTIAppbnQgaXNTYWZlKGludCBNW11bQ09MXSwgaW50IHJvdywgaW50IGNvbCwgCgkJYm9vbCB2aXNpdGVkW11bQ09MXSkgCnsgCgkvLyByb3cgbnVtYmVyIGlzIGluIHJhbmdlLCBjb2x1bW4gCgkvLyBudW1iZXIgaXMgaW4gcmFuZ2UgYW5kIHZhbHVlIGlzIDEgCgkvLyBhbmQgbm90IHlldCB2aXNpdGVkIAoJcmV0dXJuIChyb3cgPj0gMCkgJiYgKHJvdyA8IFJPVykgJiYgKGNvbCA+PSAwKSAmJiAoY29sIDwgQ09MKSAmJiAoTVtyb3ddW2NvbF0gJiYgIXZpc2l0ZWRbcm93XVtjb2xdKTsgCn0gCgovLyBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gZG8gREZTIGZvciBhIAovLyAyRCBib29sZWFuIG1hdHJpeC4gSXQgb25seSBjb25zaWRlcnMgCi8vIHRoZSA4IG5laWdoYm91cnMgYXMgYWRqYWNlbnQgdmVydGljZXMgCnZvaWQgREZTKGludCBNW11bQ09MXSwgaW50IHJvdywgaW50IGNvbCwgCgkJYm9vbCB2aXNpdGVkW11bQ09MXSkgCnsgCgkvLyBUaGVzZSBhcnJheXMgYXJlIHVzZWQgdG8gZ2V0IAoJLy8gcm93IGFuZCBjb2x1bW4gbnVtYmVycyBvZiA4IAoJLy8gbmVpZ2hib3VycyBvZiBhIGdpdmVuIGNlbGwgCglzdGF0aWMgaW50IHJvd05icltdID0geyAtMSwgLTEsIC0xLCAwLCAwLCAxLCAxLCAxIH07IAoJc3RhdGljIGludCBjb2xOYnJbXSA9IHsgLTEsIDAsIDEsIC0xLCAxLCAtMSwgMCwgMSB9OyAKCgkvLyBNYXJrIHRoaXMgY2VsbCBhcyB2aXNpdGVkIAoJdmlzaXRlZFtyb3ddW2NvbF0gPSB0cnVlOyAKCgkvLyBSZWN1ciBmb3IgYWxsIGNvbm5lY3RlZCBuZWlnaGJvdXJzIAoJZm9yIChpbnQgayA9IDA7IGsgPCA4OyArK2spIAoJCWlmIChpc1NhZmUoTSwgcm93ICsgcm93TmJyW2tdLCBjb2wgKyBjb2xOYnJba10sIHZpc2l0ZWQpKSAKCQkJREZTKE0sIHJvdyArIHJvd05icltrXSwgY29sICsgY29sTmJyW2tdLCB2aXNpdGVkKTsgCn0gCgovLyBUaGUgbWFpbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgCi8vIGNvdW50IG9mIGlzbGFuZHMgaW4gYSBnaXZlbiBib29sZWFuIAovLyAyRCBtYXRyaXggCmludCBjb3VudElzbGFuZHMoaW50IE1bXVtDT0xdKSAKeyAKCS8vIE1ha2UgYSBib29sIGFycmF5IHRvIG1hcmsgdmlzaXRlZCBjZWxscy4gCgkvLyBJbml0aWFsbHkgYWxsIGNlbGxzIGFyZSB1bnZpc2l0ZWQgCglib29sIHZpc2l0ZWRbUk9XXVtDT0xdOyAKCW1lbXNldCh2aXNpdGVkLCAwLCBzaXplb2YodmlzaXRlZCkpOyAKCgkvLyBJbml0aWFsaXplIGNvdW50IGFzIDAgYW5kIAoJLy8gdHJhdmVzZSB0aHJvdWdoIHRoZSBhbGwgY2VsbHMgb2YgCgkvLyBnaXZlbiBtYXRyaXggCglpbnQgY291bnQgPSAwOyAKCWZvciAoaW50IGkgPSAwOyBpIDwgUk9XOyArK2kpIAoJCWZvciAoaW50IGogPSAwOyBqIDwgQ09MOyArK2opIAoKCQkJLy8gSWYgYSBjZWxsIHdpdGggdmFsdWUgMSBpcyBub3QgCgkJCWlmIChNW2ldW2pdICYmICF2aXNpdGVkW2ldW2pdKSB7IAoJCQkJLy8gdmlzaXRlZCB5ZXQsIHRoZW4gbmV3IGlzbGFuZCBmb3VuZCAKCQkJCS8vIFZpc2l0IGFsbCBjZWxscyBpbiB0aGlzIGlzbGFuZC4gCgkJCQlERlMoTSwgaSwgaiwgdmlzaXRlZCk7IAoKCQkJCS8vIGFuZCBpbmNyZW1lbnQgaXNsYW5kIGNvdW50IAoJCQkJKytjb3VudDsgCgkJCX0gCgoJcmV0dXJuIGNvdW50OyAKfSAKCi8vIERyaXZlciBjb2RlIAppbnQgbWFpbigpIAp7IAoJaW50IE1bXVtDT0xdID0geyB7IDEsIDEsIDAsIDAsIDAgfSwgCgkJCQkJeyAwLCAxLCAwLCAwLCAxIH0sIAoJCQkJCXsgMSwgMCwgMCwgMSwgMSB9LCAKCQkJCQl7IDAsIDAsIDAsIDAsIDAgfSwgCgkJCQkJeyAxLCAwLCAxLCAwLCAxIH0gfTsgCgoJY291dCA8PCAiTnVtYmVyIG9mIGlzbGFuZHMgaXM6ICIgPDwgY291bnRJc2xhbmRzKE0pOyAKCglyZXR1cm4gMDsgCn0gCgovLyBUaGlzIGlzIGNvZGUgaXMgY29udHJpYnV0ZWQgYnkgcmF0aGJodXBlbmRyYSAK