如何将这些零替换为由一个封闭的零

时间:2017-10-08 04:28:02

标签: c matrix

如何将所有零替换为一个(仅限于由一个包围的那些)

案例1

输入矩阵

1 1 1 1 1

1 0 0 0 1

1 1 1 1 1

输出矩阵:

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

案例2:

输入矩阵

1 1 1 1 1

1 0 0 0 1

1 0 0 0 1

1 0 0 0 1

1 1 1 0 1

输出矩阵:

1 1 1 1 1

1 0 0 0 1

1 0 0 0 1

1 0 0 0 1

1 1 1 0 1

1 个答案:

答案 0 :(得分:1)

由于您只关心2D数组的 interior 元素的邻居,只需使用1 < rows - 11 < cols - 1的嵌套循环遍历数组边界就可以了用于检查邻居的内部元素。然后,您只需检查上下的邻居是否都是1,如果是,请创建当前元素1,然后重复检查的邻居左右

简单的强力检查是一种简单的方法,例如其中r是行,NCOLS是列:

for (int i = 1; i < r - 1; i++)
    for (int j = 1; j < NCOL - 1; j++)
        /* check neighbors */
        if ((a[i-1][j] && a[i+1][j]) || /* above/below */
            (a[i][j-1] && a[i][j+1]))   /* left/right  */
            a[i][j] = 1;

这将检查内部值是否具有1元素上方和下方,或左/右元素,并将当前元素设置为1。它将忽略所有外围元素,使最后一行1 1 1 0 1保持不变。

对于测试两个阵列上的代码的简短示例,您可以执行以下操作:

#include <stdio.h>

#define NCOL 5

int main (void) {

#ifdef W3X5
    int a[][NCOL] = {{1,1,1,1,1},
                    {1,0,0,0,1},
                    {1,1,1,1,1}},
#else
    int a[][NCOL] = {{1,1,1,1,1},
                    {1,0,0,0,1},
                    {1,0,0,0,1},
                    {1,0,0,0,1},
                    {1,1,1,0,1}},
#endif
        r = sizeof a/sizeof *a;

    for (int i = 1; i < r - 1; i++)
        for (int j = 1; j < NCOL - 1; j++)
            /* check neighbors */
            if ((a[i-1][j] && a[i+1][j]) || /* above/below */
                (a[i][j-1] && a[i][j+1]))   /* left/right  */
                a[i][j] = 1;

    /* output resulting array */
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < NCOL; j++)
            printf (" %d", a[i][j]);
        putchar ('\n');
    }

    return 0;
}

示例使用/输出

编译以检查3x5示例:

$ gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -DW3X5 -o bin/arsz3x5 arsz.c

输出

$ ./bin/arsz3x5
 1 1 1 1 1
 1 1 1 1 1
 1 1 1 1 1

编译完整的5x5示例:

$ gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o bin/arsz arsz.c

输出

$ ./bin/arsz
 1 1 1 1 1
 1 0 0 0 1
 1 0 0 0 1
 1 0 0 0 1
 1 1 1 0 1

在Windows / C89上进行编译

如果您使用的是Windows,则只需更改变量声明即可符合C89标准,例如:你只需要将i, j的声明移出循环,然后用cl.exe(VS)进行编译:

...
#endif
        i, j, r = sizeof a/sizeof *a;

    for (i = 1; i < r - 1; i++)
        for (j = 1; j < NCOL - 1; j++)
            /* check neighbors */
            if ((a[i-1][j] && a[i+1][j]) || /* above/below */
                (a[i][j-1] && a[i][j+1]))   /* left/right  */
                a[i][j] = 1;

    /* output resulting array */
    for (i = 0; i < r; i++) {
        for (j = 0; j < NCOL; j++)
            printf (" %d", a[i][j]);
        putchar ('\n');
    }

然后编译:

> cl /nologo /Wall /Ox /DW3X5 /Foobj/arsz3x5 /Febin/arsz3x5 /Tc arsz.c

> cl /nologo /Wall /Ox /Foobj/arsz /Febin/arsz /Tc arsz.c

(如果您没有将目标文件和可执行文件放在上面的/Fo/Fe单独的目录中,则可以删除objbin选项