首页 > 试题广场 >

连通块

[编程题]连通块
  • 热度指数:337 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。

输入描述:
第一行输入两个数字n,m(1<=n<=200,1<=m<=200)
后面n行01序列,每一行m个字符,表示陆地和海洋



输出描述:
输出一个数字表示岛屿的个数
示例1

输入

5 5
11000
01011
00011
00000
00111

输出

3
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] lines = sc.nextLine().split(" ");
        int m = Integer.parseInt(lines[0]);
        int n = Integer.parseInt(lines[1]);
        if(n < 1 || n > 200 || m < 1 || m > 200){
            //System.out.println(0);
            return;
        }
        int[][] arr = new int[m][n];
        int r = 0;
        while(sc.hasNext()){
            String line = sc.nextLine();
            for(int j = 0;j < n;j++){
                arr[r][j] = line.charAt(j) - '0';
            }
            r++;
            if(r >= m){
                break;
            }
        }
        if(m == 0 || n == 0){
            System.out.println(0);
            return;
        }
        int cnt = 0;
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(arr[i][j] == 1){
                    cnt++;
                    dfs(arr,i,j);
                }
            }
        }
        System.out.println(cnt);

    }

    private static void dfs(int[][] arr,int r,int c){
        int m = arr.length;
        int n = arr[0].length;
        if(r < 0 || c < 0 || r >= m || c >= n || arr[r][c] == 0){
            return;
        }
        arr[r][c] = 0;
        dfs(arr,r + 1,c);
        dfs(arr,r - 1,c);
        dfs(arr,r,c + 1);
        dfs(arr,r,c - 1);
    }
}
本地调试是没问题的,leetcode也过了,牛客只有93.75说数组越界,感觉问题出在输入上了但不知道为什么和怎么改,求大神解答
发表于 2020-02-29 17:54:53 回复(0)