gpt4 book ai didi

c - FloodFill 函数调用不起作用

转载 作者:行者123 更新时间:2023-11-30 18:40:01 27 4
gpt4 key购买 nike

我必须第一次使用洪水填充算法才能解决作业中的任务。主要问题是我写的洪水填充函数的调用好像不起作用。

我的任务与此处描述的任务非常相似: How can I find hole in a 2D matrix?

我使用了这里的算法:http://www.codeproject.com/Articles/6017/QuickFill-An-efficient-flood-fill-algorithm我根据我的需要对其进行了调整。

例如,我有这个矩阵:

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

我想把它改成这样:

0 0 0 0 0 0 0 0 0 0
0 0 0 2 2 0 0 0 0 0
0 0 2 2 2 2 2 0 3 0
0 2 2 2 2 2 0 0 3 0
0 0 2 2 2 0 0 0 3 0
0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 4 4 4 4 4 4 0 0 0
0 0 0 4 4 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

还可以计算每个“区域”或簇的元素。

在主程序中,我搜索第一个等于1的元素,并将其位置(x,y)发送给函数“color”(洪水填充函数)以成为“种子”。

我尝试使用 gdb 查找错误 - 但一无所获。我在代码中添加了一些 printf() 来查看发生了什么 - 一切正常,直到我调用函数“color”,然后什么也没有发生。我在互联网上搜索了解决方案,但没有找到解决此问题的方法。

这是洪水填充的代码:

int color(int x,int y,int n,int**sim,int nr, int h, int w)
{
if (x < h && y < w)
if( sim[x][y] == 1 )
{
sim[x][y] = n;
printf ("%d %d ", x, y);//it does not print anything here

if (sim[x-1][y] != 1 && sim[x+1][y] != 1 && sim[x][y-1] != 1 && sim[x][y+1] != 1)
return nr; /*this happens when everything around is equal to 0 or n, so there is nothing to modify and the program should end*/
else
{
nr++;
color(x-1,y,n,sim,nr,h,w);
color(x+1,y,n,sim,nr,h,w);
color(x,y-1,n,sim,nr,h,w);
color(x,y+1,n,sim,nr,h,w);
}
}
}

以及主函数中的调用:

int **s;
s = malloc(m*sizeof(int *));
for(i=1; i <= h; i++)
s[i] = malloc(m*sizeof(int));
a=0;
b=0;
while (a <= h && b <= w)
{
k = 0;
for(i=a; i < h && k == 0; i++)
for(j=b; j < w; j++)
if( s[i][j] == 1 ) //find the first element = 1 and stop to its position
{k = 1; printf("%d %d ", i, j);}
printf("\n");
if(k == 1)
{
a = i;
b = j;
nr = color(i,j,c,s,0,h,w); //call the function
printf("%d,%d,%d,%d ", k, c, i, j);
cluster[c] = nr;
c++;
}
if (k == 0)
break; //if it is no area left to modify
}

我是初学者,以前从未使用过洪水填充。我什至不确定出了什么问题:洪水填充代码、函数的调用或者我在函数中传递矩阵 sim[][] 的方式。怎么了?

最佳答案

OP 代码中存在许多错误,例如使用互换的 H 和 V 数组方向,并且没有检查数组边界以防止递归超出数组边缘并在碰巧找到“1”的地方继续进行',或更糟糕的是,使用未定义的指针访问内存。

#include <stdio.h>
#include <stdlib.h>

#define h 11 // height
#define w 10 // width

void color(int x, int y, int n, int **sim, int *nr) {
if (x>=0 && x<w && y>=0 && y<h && n>1) {
if( sim[y][x] == 1 ) {
sim[y][x] = n;
(*nr)++;
color(x-1, y, n, sim, nr);
color(x+1, y, n, sim, nr);
color(x, y-1, n, sim, nr);
color(x, y+1, n, sim, nr);
}
}
}

void show(int **sim) {
int i, j;
for (j=0; j<h; j++) {
for (i=0; i<w; i++) {
printf ("%3d", sim[j][i]);
}
printf ("\n");
}
printf ("\n");
}

int main() {
int **s;
int n, i, j, nr;
s = malloc(h*sizeof(int *));
for(j=0; j<h; j++)
s[j] = malloc(w*sizeof(int));
for (j=0; j<h; j++)
for (i=0; i<w; i++)
s[j][i] = rand() % 2;
show(s);

n = 2;
for (j=0; j<h; j++) {
for (i=0; i<w; i++) {
if (s[j][i] == 1) {
nr = 0;
color(i, j, n, s, &nr);
printf("%3d,%3d,%3d,%3d\n", i, j, n, nr);
n++;
}
}
}
printf ("\n");
show(s);

for(i=h-1; i>=0; i--)
free (s[i]);
free (s);
return 0;
}

程序输出。

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

0, 0, 2, 32
8, 1, 3, 1
9, 2, 4, 1
2, 3, 5, 1
1, 6, 6, 8
3, 7, 7, 1
7, 7, 8, 6
3, 9, 9, 2
6, 10, 10, 1

2 2 0 0 2 0 0 0 0 0
2 2 2 2 2 2 2 0 3 0
2 0 0 2 0 0 2 0 0 4
2 0 5 0 2 0 2 2 2 0
2 2 0 2 2 0 2 2 2 0
2 0 0 2 2 2 2 2 2 0
0 6 0 0 0 0 0 0 0 0
0 6 0 7 0 0 0 8 8 0
6 6 0 0 0 0 0 0 8 0
0 6 0 9 9 0 0 0 8 8
6 6 6 0 0 0 10 0 8 0

关于c - FloodFill 函数调用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27650428/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com