2011-11-03 36 views
1

今天我们已经完成了一项任务,我们必须在图片中找到彼此相关的所有像素。画面只是绿色= 1,无颜色= 0,可以用数组来表示:C中的斑点计数功能

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)); 
    } 




} 

编辑:

我已经更新上面的代码,现在我有一个新的问题,它得到(在对方一起像素ammount的)权总和,但是当我打印出总和(在main();)时,它表示1,为什么它不会从递归函数继承到主函数?

+0

我的问题是,它似乎即使它不应该被允许电网外去了,我不知道怎样才能得到任何接近的时候我不知道确切的问题是什么,它的旁边不这样做。 – Dennis

回答

3

你看看当前像素的所有邻居:

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){ 

它可能仍然不会工作,虽然,但由于这是功课我只给你一些提示:你忽略了递归调用的返回值(不这样做),你请勿初始化sum(打开编译器警告以获得通知)。您也不复制完整的网格:memcpy(gridCopy, grid, 5*5);副本25 字节,而不是25 整数。改为使用memcpy(gridCopy, grid, 5 * 5 * sizeof(int));

+0

谢谢,我会研究这些事情。尽管这不是作业。我们的讲座分为2部分,1部分讲座和1部分小组工作。小组任务只在这些课程中使用,所以我不知道如何做到这一点,除非我研究我的自我,也不必将其转入。 – Dennis