Problem Statement
You are given a matrix with
Input Format
There will be three parts of t input:
The first line will contain
The second line will contain
This will be followed by the matrix grid: the list of numbers that make up the matrix.
Output Format
Print the length of the largest region in the given matrix.
Constraints
Sample Input:
4
4
1 1 0 0
0 1 1 0
0 0 1 0
1 0 0 0
Sample Output:
5
Task:
Write the complete program to find the number of cells in the largest region.
Explanation
X X 0 0
0 X X 0
0 0 X 0
1 0 0 0
The X characters indicate the largest connected component, as per the given definition. There are five cells in this component.
思路分析:这题是Hackerrank一次的比赛题目。也是G公司一次面试中出现的面试原题。
要在一个矩阵中找到最大的连通区域。
基本能够用DFS搜索解决,在每一个位置重新启动搜索找连通区域,一共同拥有8个方向/分支,贪心保留最大cell数目。用visited标记数组记录已经count过的位置进行剪枝加速。
是一道中规中矩的考察DFS/BFS搜索的题目。
AC Code
import java.io.*; import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; public class Solution { static int[][] actionCosts = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; static int cellCounter = 0; public static void main(String[] args) throws NumberFormatException, IOException { /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */ DataInputStream in = new DataInputStream(new BufferedInputStream(System.in)); int m = Integer.valueOf(in.readLine()); int n = Integer.valueOf(in.readLine()); int [][] matrix = new int [m][n]; for(int i = 0; i < m; i++){ String line = in.readLine(); for(int j = 0; j < n; j++){ matrix[i][j] = Integer.valueOf(line.split(" ")[j]); } } int maxNum = findMaxConnectedCellNum(matrix, m, n); System.out.println(maxNum); } private static int findMaxConnectedCellNum(int[][] matrix, int m, int n) { // TODO Auto-generated method stub int [][] visited = new int[m][n]; int maxNum = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ dfs(matrix, visited, i, j, m, n); if(cellCounter > maxNum) maxNum = cellCounter; cellCounter = 0; } } return maxNum; } private static void dfs(int[][] matrix, int[][] visited, int i, int j, int m, int n) { // TODO Auto-generated method stub if(i < 0 || i >= m || j < 0 || j >= n){ return; } if(visited[i][j] == 1 || matrix[i][j] == 0) return; cellCounter++; visited[i][j] = 1; for(int di = 0; di < 8; di++){ dfs(matrix, visited, i + actionCosts[di][0], j + actionCosts[di][1], m, n); } } }