Java 计算二维阵列中的云数

Java 计算二维阵列中的云数,java,algorithm,data-structures,depth-first-search,breadth-first-search,Java,Algorithm,Data Structures,Depth First Search,Breadth First Search,我试图从代码斗争中找出这个问题,但我没有太多的图形遍历经验,所以我很挣扎。我读到的关于这个特殊问题的提示之一是“图遍历”,所以我做了一个BFS,但我不确定如何获得云的数量 无论出于什么原因,这个问题和许多其他问题,当我要为它编写代码时,我的头脑总是一片空白。我试图找到连续的1,但没有结果。有人能帮我吗 给定由“1”(云层)和“0”(晴空)组成的二维栅格天空地图,计算云层的数量。云被晴朗的天空包围,由相邻的云水平或垂直连接而成。您可以假设天空地图的所有四条边都被晴朗的天空包围 范例 skyMap

我试图从代码斗争中找出这个问题,但我没有太多的图形遍历经验,所以我很挣扎。我读到的关于这个特殊问题的提示之一是“图遍历”,所以我做了一个BFS,但我不确定如何获得云的数量

无论出于什么原因,这个问题和许多其他问题,当我要为它编写代码时,我的头脑总是一片空白。我试图找到连续的1,但没有结果。有人能帮我吗

给定由“1”(云层)和“0”(晴空)组成的二维栅格天空地图,计算云层的数量。云被晴朗的天空包围,由相邻的云水平或垂直连接而成。您可以假设天空地图的所有四条边都被晴朗的天空包围

范例

skyMap = [['0', '1', '1', '0', '1'],
         ['0', '1', '1', '1', '1'],
         ['0', '0', '0', '0', '1'],
         ['1', '0', '0', '1', '1']]
输出应该是 计数云(天空地图)=2

输出应该是
countClouds(天空地图)=5。

这里有一个粗略的解决问题的方法。不过,你应该努力改进这一点

public static void removeCloud(int x, int y, int[][] sky) {
    sky[x][y] = 0;
    if(x > 0 && sky[x-1][y] == 1) {
        removeCloud(x-1,y,sky);
    ...
}

public static int countClouds(int[][] sky) {
    int count = 0
    for(int i = 0; i < sky.length; i++) {
        for(int j = 0; j < sky[i].length) {
            if(sky[i][j] == 1) {
                count++;
                removeCloud(i,j,sky);
            }
        }
    }
}
publicstaticvoidremovecloud(intx,inty,int[]]sky){
天空[x][y]=0;
如果(x>0&&sky[x-1][y]==1){
移除云(x-1,y,天空);
...
}
公共静态int countClouds(int[][]天空){
整数计数=0
对于(int i=0;i
我可以看到,即使是
1
中的一个未加保护的单元格作为一个值也被视为一个云,我错了吗?DFS也可以工作。如果节点已被访问,则应保留一个布尔数组,该数组存储true,否则为false。递归遍历2D数组,如果节点未被访问,则每次都会更深一层。如果节点已访问,移动到下一个,否则增加一个计数器并递归。在访问所有节点时停止。@是的,你是对的。我将创建一个方法,每次调用它时检查邻居,然后递归遍历数组。请查看哪个有项目的起点。重复项解决了更复杂的问题这个问题的x版本,但这里可以使用相同的方法。也类似于。
public static void removeCloud(int x, int y, int[][] sky) {
    sky[x][y] = 0;
    if(x > 0 && sky[x-1][y] == 1) {
        removeCloud(x-1,y,sky);
    ...
}

public static int countClouds(int[][] sky) {
    int count = 0
    for(int i = 0; i < sky.length; i++) {
        for(int j = 0; j < sky[i].length) {
            if(sky[i][j] == 1) {
                count++;
                removeCloud(i,j,sky);
            }
        }
    }
}