如何将所有零替换为一个(仅限于由一个包围的那些)
案例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
答案 0 :(得分:1)
由于您只关心2D数组的 interior 元素的邻居,只需使用1 < rows - 1
和1 < 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
单独的目录中,则可以删除obj
和bin
选项