Each element in the array is connected to eight other elements (toward top, down, left and right). For example, the zero below is connected to all the ones
1 1 1 1 0 1 1 1 1
Given a two-dimensional array of 0’s and 1’s. Find the number of islands where an island is a group of connected 1’s. For example: The below array has 4 islands (shown in different colours)
1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1
Write code which will accept this 2-dim array and return the number of islands.
Solution:
The problem is similar to the problem of connected components in graph.
The solution is simple. Look for 1 in the array which is not connected to any other graph, when you find 1 search for the all the entries in this island by recursively searching the eight connected nodes, and mark them connected.
In the code let us set the value to -1 to indicate that the node is already connected to an island.
Let’s first write the recursive function to mark the elements as connected. It will take a position (i,j) and mark it -1 and then look for nearby cells and mark all the nodes that are 1 as -1. And also call the function recursively.
void markIsland(int arr[][5], int i, int j, int m, int n) { arr[i][j] = -1; if(i-1 >= 0) { // (i-1, j-1) if(j-1 >= 0 && arr[i-1][j-1] == 1) markIsland(arr, i-1, j-1, m, n); // (i-1, j) if(arr[i-1][j] == 1) markIsland(arr, i-1, j, m, n); // (i-1, j+1) if(j+1 < n && arr[i-1][j+1] == 1) markIsland(arr, i-1, j+1, m, n); } if(i+1 < m) { // (i+1, j-1) if(j-1 >= 0 && arr[i+1][j-1] == 1) markIsland(arr, i+1, j-1, m, n); // (i+1, j) if(arr[i+1][j] == 1) markIsland(arr, i+1, j, m, n); // (i+1, j+1) if(j+1 < n && arr[i+1][j+1] == 1) markIsland(arr, i+1, j+1, m, n); } // (i, j-1) if(j-1 >= 0 && arr[i][j-1] == 1) markIsland(arr, i, j-1, m, n); // (i, j+1) if(j+1 < n && arr[i][j+1] == 1) markIsland(arr, i, j+1, m, n); }
The main function that count the islands will just call this function to mark all the elements in the islands whenever a 1 is encountered.
int countIslands(int arr[][5], int m, int n) { int count = 0; for(int i=0; i<m; i++) for(int j=0; j<n; j++) if(arr[i][j] == 1) { count++; markIsland(arr, i, j, m, n); } return count; }
The only problem with above code is that it changes all the 1’s to -1. But that can easily be corrected by adding one more loop to the function
for(int i=0; i<m; i++) for(int j=0; j<n; j++) if(arr[i][j] == -1) arr[i][j] = 1;
Time complexity: O(M*N).
Extra space will be used because of recursion.
3 Comments
My program is compiling but i cannot got the accourate result because i think so there is some mistake for returining the function value,Please correct it and send back to me.
#include
#include
#include
#include
#include
#define ROW 10
#define COL 10
int markIsland(int M[][COL], int i, int j, int m, int n);
int countIslands(int M[][COL], int m, int n);
int markIsland(int M[][COL], int i, int j, int m, int n)
{
M[i][j] = -1;
if(i-1 >= 0)
{
if(j-1 >= 0 && M[i-1][j-1] == 1)
markIsland(M, i-1, j-1, m, n);
if(M[i-1][j] == 1)
markIsland(M, i-1, j, m, n);
if(j+1 < n && M[i-1][j+1] == 1)
markIsland(M, i-1, j+1, m, n);
}
if(i+1 = 0 && M[i+1][j-1] == 1)
markIsland(M, i+1, j-1, m, n);
if(M[i+1][j] == 1)
markIsland(M, i+1, j, m, n);
if(j+1 = 0 && M[i][j-1] == 1)
markIsland(M, i, j-1, m, n);
if(j+1 < n && M[i][j+1] == 1)
markIsland(M, i, j+1, m, n);
}
int countIslands(int M[][COL], int m, int n)
{
int count = 0;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(M[i][j] == -1)
M[i][j] = 1;
{
count++;
}
return count;
}
int main()
{
int m, i,j,n, c, d,f, matrix[10][10];
m = ROW;
n = COL;
srand(time(NULL));
printf("Enter the number of rows and columns of matrix\n ");
for( i = 0 ; i < m ; i++ )
{
for( j = 0 ; j < n ; j++ )
{
printf("%d\t",rand() % 2);
}
}
printf("Number of islands is: %d ", countIslands(matrix, m, n));
getch();
}
Thank you! but i want a C program that display a snail by the arrangement of numbers. like:-7 8 9
6 1 2
5 4 3
Thank you so much for the code. The logic is very lucid and effective. Beautifully done. 😀