Hackerrank Connected Cell in a Grid

本文详细介绍了如何使用深度优先搜索(DFS)算法在给定矩阵中找到最大连通区域,并提供了完整的AC代码实现。重点阐述了算法的实现过程、关键步骤以及优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Statement

You are given a matrix with m rows and n columns of cells, each of which contains either 1or 0. Two cells are said to be connected if they are adjacent to each other horizontally, vertically, or diagonally. The connected and filled (i.e. cells that contain a 1) cells form aregion. There may be several regions in the matrix. Find the number of cells in the largest region in the matrix.

Input Format
There will be three parts of t input:
The first line will contain m, the number of rows in the matrix.
The second line will contain n, the number of columns in the matrix.
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
0<m<10
0<n<10

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);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值