Matrix Search – find group of connected-1s/sectors in a matrix
October 4, 2012 4 Comments
find length of connected cells of 1s(sector) in an matrix of 0s and 1s?
find number of islands in a matrix?
find connected sectors of a matric?
implementation of flood fill algorithm?
All these questions are same, below are the implementation details
Full source code can be downloaded from here
Consider a two-dimensional grid of cells, each of which may be empty or filled. The filled cells that are connected form a sector. Two cells are said to be connected if they are adjacent to each other horizontally, vertically or diagonally. There may be several sectors on the grid. Your job is to find the largest sector (in terms of number of cells) on the grid.
The following figure illustrates a grid with 3 sectors (the largest contains 5 cells).
Problem
Write a program that determines the size of the largest sector for a given grid.
Input
The input begins with a single positive integer on a line by itself indicating the number of the cases
following, each of them as described below. This line is followed by a blank line, and there is also a blank
line between two consecutive inputs. The grid is given as a set of string, each composed of 0s and 1s.
The 1 indicates that the cell is filled and 0 indicates an empty cell. The strings should be converted into
the grid format. The largest grid that should be considered is a 25×25 grid.
Attached is the input file:
input.txt
Output
For each test case, the output must follow the description below. The outputs of two consecutive cases
will be separated by a blank line. The output is the size of the largest sector found on the grid.
Sample Input
2
11000
01100
00101
10001
01011
1011
1010
Sample Output
5
3
This solution is a recursion of depth of 8 levels :
int findMaxDepth(int[][] n, boolean[][] bool, int i, int j) { // Check if i, j (indexes) are within the size of array // Check if the cell is already traversed or not using bool array // Check if the cell value is 1 before counting it as part of a sector if(i >= 0 && i < n.length && j >=0 && j < n[0].length && bool[i][j] != true && n[i][j] != 0) { currentDepth++; // Mark the status of the cell for backtracking purpose bool[j] = true; // left traversal findMaxDepth(n, bool, i-1, j); // right traversal findMaxDepth(n, bool, i+1, j); // top traversal findMaxDepth(n, bool, i, j-1); // bottom traversal findMaxDepth(n, bool, i, j+1); // Top-Bottom diagnol // diagnol-down traversal findMaxDepth(n, bool, i+1, j+1); // diagnol-up traversal findMaxDepth(n, bool, i-1, j-1); // Bottom-Top diagnol // diagnol-down traversal findMaxDepth(n, bool, i+1, j-1); // diagnol-up traversal findMaxDepth(n, bool, i-1, j+1); } return currentDepth; }
Full source code can be downloaded from here
Attaching the problem statement, input.txt.
counting_cell
Better than my imperative solution (http://java.dzone.com/articles/thursday-code-puzzler-matrix-search#comment-98739) but i think you need to return max of all your recursions and pass currentMaxDepth thru params right?
I have copied the full working code. The return type of ‘findMaxDepth()’ is maximum of currentDepth. You can execute this program
the index usage is not correct as the right traversal we have to increase the j not the i, and the same is true for the left. the i is index for the height and j for width.
this is unit tested code, I will check again