【问题标题】:Count clouds in a 2d array [duplicate]计算二维数组中的云[重复]
【发布时间】:2017-11-15 16:29:13
【问题描述】:

我正试图从 CodeFights 中找出这个问题,但我对图形遍历没有太多经验,所以我很挣扎。我为这个特定问题阅读的提示之一是“图遍历”,所以我做了一个 BFS,但我不确定如何获得云的数量。

无论出于何种原因,这个问题和许多其他问题,在为它编写代码时,我的大脑往往会一片空白。我试图找到连续的 1 但无济于事。谁能帮帮我?

https://codefights.com/interview/pDTvSuHBgAB9dz5ik/companies/N3sScnJbzdPDQaHPj

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

例子

skyMap = [['0', '1', '1', '0', '1'],
         ['0', '1', '1', '1', '1'],
         ['0', '0', '0', '0', '1'],
         ['1', '0', '0', '1', '1']]

输出应该是 countClouds(skyMap) = 2;

skyMap = [['0', '1', '0', '0', '1'],
         ['1', '1', '0', '0', '0'],
         ['0', '0', '1', '0', '1'],
         ['0', '0', '1', '1', '0'],
         ['1', '0', '1', '1', '0']]

输出应该是 countClouds(skyMap) = 5.

【问题讨论】:

  • 我可以看到即使1一个未包围单元格作为值也被视为云,我错了吗?
  • DFS 也可以。如果节点已被访问,您应该保留一个布尔数组,该数组存储 true,否则存储 false。递归遍历 2D 数组,如果没有访问过节点,则每次都会更深一层。如果已经访问了一个节点,则移动到下一个节点,否则增加一个计数器并递归。访问完所有节点后停止。
  • @Yahya 你是对的。
  • 我会创建一个方法,每次调用它时检查邻居,然后递归遍历数组。请参阅this answer,它为您的项目提供了起点。
  • 重复项解决了这个问题的一个更复杂的版本,但在这里可以使用相同的方法。也类似于Number of Groups/Islands of 1's in a Matrix: Definition clarification

标签: java algorithm data-structures depth-first-search breadth-first-search


【解决方案1】:

这是解决问题的粗略方法。不过,您应该尝试改进这一点。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2017-07-16
    • 2012-11-02
    • 2019-12-11
    • 2017-10-24
    • 2021-02-14
    • 2018-05-20
    相关资源
    最近更新 更多