Hello friends,
In this post, I would like to present a problem I encountered where we need to find consecutive occurrence of elements in a 2D matrix of N * N size. If a cell has same element as contained by itself in the top, bottom , right or left direct neighbor cell, then these two cells are said to have consecutive occurrence of same element .
The consecutive same elements form a cluster (sector).
The problem is to find the number of such clusters of same elements and to find the maximum size of the cluster.
For example
Input
N = 5;
Matrix :
{ 1, 1, 1, 0, 0 },
{ 1, 0, 1, 0, 0 },
{ 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 1 }
Solution :
We can see we have three clusters with sizes as 8, 4 and 1.
So we need to output number of clusters followed by a space and then need to output the maximum size;
Output : 3 8
Lets see the code for this problem. I have used a stack for brack-tracing in this problem ( implemented the basic stack using array, although I could have used the java.util.Stack or simply ArrayList which would have reduced few lines of code, but anyways I choose to use basic array based Stack) In the program below I have used 'sector' instead of cluster.
There can be a approach using recursion, but I find understanding the code execution flow better in iterative manner.
In this post, I would like to present a problem I encountered where we need to find consecutive occurrence of elements in a 2D matrix of N * N size. If a cell has same element as contained by itself in the top, bottom , right or left direct neighbor cell, then these two cells are said to have consecutive occurrence of same element .
The consecutive same elements form a cluster (sector).
The problem is to find the number of such clusters of same elements and to find the maximum size of the cluster.
For example
Input
N = 5;
Matrix :
{ 1, 1, 1, 0, 0 },
{ 1, 0, 1, 0, 0 },
{ 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 1 }
Solution :
We can see we have three clusters with sizes as 8, 4 and 1.
So we need to output number of clusters followed by a space and then need to output the maximum size;
Output : 3 8
Lets see the code for this problem. I have used a stack for brack-tracing in this problem ( implemented the basic stack using array, although I could have used the java.util.Stack or simply ArrayList which would have reduced few lines of code, but anyways I choose to use basic array based Stack) In the program below I have used 'sector' instead of cluster.
There can be a approach using recursion, but I find understanding the code execution flow better in iterative manner.
public class LargestGridSector { /// input starts public static int data[][] =
{ { 1, 1, 1, 0, 0 },
{ 1, 0, 1, 0, 0 },
{ 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 1 } };
public static int N = 5;
/// input ends
public static void main(String[] args) {
largedtGridSector();
System.out.println(numOfSectors +" "+maxSectorSize);
}
public static class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static int largedtGridSector = 0;
public static final int ONE = 1;
public static final int ZERO = 0;
public static final int VISITED = 3;
public static final int INSTACK = 2;
public static int numOfSectors = 0;
public static int maxSectorSize = 0;
public static int currentSectorSize = 0;
public static Point[] stack = new Point[N * N];
public static int stackIndex = -1;
public static void largedtGridSector() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
switch (data[i][j]) {
case ONE:
int x = i;
int y = j;
numOfSectors++;
currentSectorSize = 0;
boolean toBreakWhile = false;
while (true) {
switch (data[x][y]) {
case ONE:
Point p = new Point(x, y);
push(p);
data[p.x][p.y] = INSTACK;
currentSectorSize++;
if (y < N - 1 && data[x][y + 1] == ONE) {
y++;
} else if (y > 0 && data[x][y - 1] == ONE) {
y--;
} else if (x < N - 1 && data[x + 1][y] == ONE) {
x++;
} else if (x > 0 && data[x - 1][y] == ONE) {
x--;
} else if (stackIndex >= 0) {
Point prePoint = pop();
data[prePoint.x][prePoint.y] = VISITED;
if (stackIndex >= 0) {
x = stack[stackIndex].x;
y = stack[stackIndex].y;
}
}
break;
case INSTACK:
if (y < N - 1 && data[x][y + 1] == ONE) {
y++;
} else if (y > 0 && data[x][y - 1] == ONE) {
y--;
} else if (x < N - 1 && data[x + 1][y] == ONE) {
x++;
} else if (x > 0 && data[x - 1][y] == ONE) {
x--;
} else if (stackIndex >= 0) {
Point prePoint = pop();
data[prePoint.x][prePoint.y] = VISITED;
if (stackIndex >= 0) {
x = stack[stackIndex].x;
y = stack[stackIndex].y;
}
}
break;
default:
toBreakWhile = true;
break;
}
if (stackIndex < 0 || toBreakWhile) {
break;
}
}
if (currentSectorSize > maxSectorSize) {
maxSectorSize = currentSectorSize;
}
break;
default:
continue;
}
}
}
}
public static void push(Point p) {
stackIndex++;
stack[stackIndex] = p;
}
public static Point pop() {
Point p = stack[stackIndex];
stack[stackIndex] = null;
stackIndex--;
return p;
}
}
No comments:
Post a Comment
Hi Friends, Please leave your comments as they shall be greatest motivation , shall help me make corrections to my existing posts and will enable me to create better posts. :)