如何去除 2D 阵列中的"isolated"元素?

How to remove "isolated" elemenents in a 2D Array?

本文关键字:isolated 元素 何去 2D 阵列      更新时间:2023-10-16

我得到了一个包含1和0的矩阵(随机生成)。我想删除"孤立"的1s。

例如:

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

应该是:

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

每个被零包围的数字1(对角线不计算)都必须更改为0。

以下是我到目前为止所写的内容,但它似乎没有任何作用(它打印出与以前相同的矩阵):

void deleteIsolatedOnes(int(&digit_grid)[GRID_SIZE][GRID_SIZE])
{
    for (int i = 0; i < GRID_SIZE; i++)
    {
        for (int j = 0; j < GRID_SIZE; j++)
        {
            if (digit_grid[i][j]) // if the current element is one
            {
                if (i == 0 && j == 0) // top-left corner
                {
                    if (!digit_grid[i][j + 1] && !digit_grid[i + 1][j])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                else if (i == 0 && j == GRID_SIZE - 1) // top-right corner
                {
                    if (!digit_grid[i][j - 1] && !digit_grid[i + 1][j])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                else if (i == GRID_SIZE - 1 && j == 0) // bottom-left corner
                {
                    if (!digit_grid[i - 1][j] && !digit_grid[i][j + 1])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                else if (i == GRID_SIZE - 1 && j == GRID_SIZE - 1) // bottom-right corner
                {
                    if (!digit_grid[i - 1][j] && !digit_grid[i][j - 1])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                else if (i == 0) // top row
                {
                    if (!digit_grid[i][j - 1] && !digit_grid[i - 1][j] && !digit_grid[i][j + 1])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                else if (i == GRID_SIZE - 1) // bottom row
                {
                    if (!digit_grid[i][j - 1] && !digit_grid[i + 1][j] && !digit_grid[i][j + 1])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                else if (j == 0) // left column
                {
                    if (!digit_grid[i + 1][j] && !digit_grid[i][j + 1] && !digit_grid[i - 1][j])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                else if (j == GRID_SIZE - 1) // right column
                {
                    if (!digit_grid[i + 1][j] && !digit_grid[i][j - 1] && !digit_grid[i - 1][j])
                    {
                        digit_grid[i][j] = 0;
                    }
                }
                // for the inner side of the matrix:
                else if (!digit_grid[i + 1][j] && !digit_grid[i - 1][j] && !digit_grid[i][j + 1] && !digit_grid[i][j - 1])
                {
                    digit_grid[i][j] = 0;
                }
            }
        }
    }
}

所以。。我已经解决了这个问题,我很惭愧地分享是什么导致的:D

基本上,我混淆了顶部和底部行的索引:

!digit_grid[i + 1][j]

应该是

!digit_grid[i - 1][j]

上面是,反面是。。。

我对这个错误和浪费你的时间感到抱歉:D

谢谢你的建议!

bool _checkIsolatedOne(int i, int j, int(&digit_grid)[GRID_SIZE][GRID_SIZE])
{
    bool one_found = false;
    if (i > 0)
        one_found |= digit_grid[j][i - 1];
    if (j > 0)
        one_found |= digit_grid[j - 1][i];
    if (i < GRID_SIZE - 1)
        one_found |= digit_grid[j][i + 1];
    if (j < GRID_SIZE - 1)
        one_found |= digit_grid[j + 1][i];
    return !one_found;
}

void deleteIsolatedOnes(int(&digit_grid)[GRID_SIZE][GRID_SIZE])
{
    for (int j = 0; j < GRID_SIZE - 1; j++)
        for (int i = 0; i < GRID_SIZE - 1; i++)
            if (digit_grid[j][i] == 1)
            {
                bool isolated = _checkIsolatedOne(i, j, digit_grid);
                if (isolated)
                    digit_grid[j][i] = 0;
            }
}

这个问题可以通过使用计算机视觉领域的卷积矩阵来解决。简而言之,它包括在矩阵中滑动一个3x3的窗口,并根据邻居一次改变一个元素(窗口的中心)。

对于像你这样的小例子来说,可能太复杂了(无意的双关语),但对于大规模的案例来说肯定很有用,因为它可以很容易地进行优化。对于一个有效的解决方案,搜索"可分离的2D卷积"。

#include <iostream>
using namespace std;
int main() {
    int a[100][100]={0},row, col;
    cin>>row>>col;
    for(int i = 1; i <= row; i++){
        for(int j = 1; j <= col; j++){
            cin>>a[i][j];
        }
    }
    for(int i = 1; i <= row; i++){
        for(int j = 1; j <= col; j++){
            if(!a[i - 1][j] && !a[i][j + 1] && !a[i + 1][j] && !a[i][j - 1])
                a[i][j] = 0;
        }
    }
    for(int i = 1; i <= row; i++){
        for(int j = 1; j <= col; j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

检查程序的输出