如何去除 2D 阵列中的"isolated"元素?
How to remove "isolated" elemenents in a 2D Array?
我得到了一个包含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;
}
检查程序的输出
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 如何去除 2D 阵列中的"isolated"元素?