【问题标题】:How to lable connected components in a 2D array?如何标记二维数组中的连接组件?
【发布时间】:2017-07-19 05:14:14
【问题描述】:

我有这样的二维数组:

0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0

我想将连接的组件(4个方向)标记为这样:

0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 2 2 2 0 3 3 0 1 0 0 0 0 0 1 0 0 2 0 2 0 3 3 0 1 0 4 4 4 0 1 0 0 2 0 2 0 0 0 0 1 0 4 0 4 0 1 0 0 2 0 2 0 0 0 0 1 0 4 0 4 0 1 0 0 2 2 2 0 0 0 0 1 0 4 0 4 0 1 0 0 0 0 0 5 5 5 0 1 0 4 4 4 0 1 0 0 0 0 0 5 0 5 0 1 0 0 0 0 0 1 0 0 0 0 0 5 5 5 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 6 6 0 0 0 0 7 7 7 7 0 0 0 6 0 0 0 6 0 0 0 0 7 0 0 7 0 0 0 6 0 6 6 6 6 6 0 0 7 7 7 7 0 0 0 6 0 6 0 6 0 6 0 0 7 7 7 7 0 0 0 6 6 6 6 6 6 6 0 0 0 0 0 0 0 0 0 6 6 6 6 6 6 6 0 0 0 0 0 0 0 0

请帮我解决这个问题。谢谢!!!(java或javascript代码示例会很棒)

【问题讨论】:

  • 到目前为止你做了什么来解决这个问题?
  • 我为 row 和 col 做了 2 个 for 循环,然后对于每个元素,我检查方向以查看它们的邻居是否相同,然后对它们进行分组。但我这样做总是有冲突。
  • @ThienN 请不要完全更改已回答的问题。可以的话,问一个新的。

标签: javascript java 2d flood-fill connected-components


【解决方案1】:

首先将1的值改为-1,因为你需要使用1作为标志。

然后您可以迭代元素并执行检查,如果它具有标志-1,则将其更改为实际值。继续右下角的元素。

如果找到一个元素,则增加值。

function test(array, i, j, value) {
    if (array[i] && array[i][j] === -1) {
        array[i][j] = value;
        test(array, i + 1, j, value);
        test(array, i, j + 1, value);
        return true;
    }
}

var data = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1], [0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1], [0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1], [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1], [0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1], [0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0], [0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]],
    value = 1;

data.forEach(function (a) {
    a.forEach(function (b, i, bb) {
        bb[i] = -b;
    });
});

data.forEach(function (a, i, aa) {
    a.forEach(function (b, j, bb) {
        test(aa, i, j, value) && value++;
    });
});

document.getElementById('out').innerHTML = data.map(function (a) { return a.join(' '); }).join('\n');
<pre id="out"></pre>

【讨论】:

  • 我只是稍微更新一下问题,你能帮我解决这个问题吗?
  • @ThienN,实际上你提出了一个全新的问题..请将其恢复为原始问题 - 并提出一个新问题。
  • 我没有足够的积分来提出新问题。我必须再等 3 天才能做到这一点。你知道我怎样才能获得更多积分,以便我可以提出更多问题吗?
  • 为了新的目的而破坏问题并使给出的答案无效是没有意义的。所以请看这里(stackoverflow.com/help/someone-answers),关于问题和答案,并就minimal reproducible example提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多