Сегодня у нас была задача, где мы должны были найти все пиксели, которые были связаны друг с другом на изображении. Картинка просто зеленая = 1, без цвета = 0 и может быть представлена в виде массива:
int grid[5][5] = {
{1, 1, 0, 0, 0},
{0, 1, 1, 0, 0},
{0, 0, 1, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 0, 1, 1},
};
Мы сидели в моей группе 3 часа и пытались решить эту проблему (первая лекция о рекурсии), но мы просто не можем заставить ее работать. Похоже, проблема заключается в том, что функции как-то принимают за пределы сетки. Любой кто, вот код:
#include <stdio.h>
#include <string.h>
//Prototype
int blob_count(int y, int x, int gridCopy[][5], int sum);
int blob_count(int y, int x, int gridCopy[][5], int sum){
//Local vars
int posX, posY;
printf("\n\nX: %d - Y: %d\nposX: %d - posY: %d\nSum: %d", x, y, posX, posY, sum);
printf("\n\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n",
gridCopy[0][0],
gridCopy[0][1],
gridCopy[0][2],
gridCopy[0][3],
gridCopy[0][4],
gridCopy[1][0],
gridCopy[1][1],
gridCopy[1][2],
gridCopy[1][3],
gridCopy[1][4],
gridCopy[2][0],
gridCopy[2][1],
gridCopy[2][2],
gridCopy[2][3],
gridCopy[2][4],
gridCopy[3][0],
gridCopy[3][1],
gridCopy[3][2],
gridCopy[3][3],
gridCopy[3][4],
gridCopy[4][0],
gridCopy[4][1],
gridCopy[4][2],
gridCopy[4][3],
gridCopy[4][4]);
//Find the position 1 behind and 1 above the starting point, and start the loop there
for(posX = -1;posX <=1; posX++){
for(posY = -1; posY <= 1; posY++){
if((y + posY) >= 0 && (x + posX) >= 0){
if((y + posY) <= 5 && (x + posX) <= 5){
if(gridCopy[posY+y][posX+x] == 1){
//Set the starting point to 0 (so it wont get calculated again)
gridCopy[posY+y][posX+x] = 0;
y = posY+y;
x = posX+x;
sum++;
blob_count(y, x, gridCopy, sum);
}
}
}
}
}
return sum;
}
int main (void)
{
int grid[5][5] = {
{1, 1, 0, 0, 0},
{0, 1, 1, 0, 0},
{0, 0, 1, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 0, 1, 1},
};
//Create a manipulateable grid
int gridCopy[5][5];
memcpy(gridCopy, grid, 5*5*sizeof(int));
//Start Positions
int start_x = 0;
int start_y = 3;
//If the starting point selected, is not 0, initiate the function:
if(grid[start_y][start_x] != 0){
printf("\nSum: %d", blob_count(start_y ,start_x, gridCopy, 0));
}
}
Edit:
Я обновил код выше, и теперь у меня возникла новая проблема, он получает правильную сумму (количество пикселей в сочетании друг с другом), однако, когда я распечатываю сумму (в main ();), она говорит 1, почему он не переносится из рекурсивной функции в основную функцию?