2015-08-27 17 views

回答

1

想法很簡單:標記每個連續的斑點並計算標記了多少個斑點。

下面是一些僞代碼(未指定一種編程語言),讓你開始:

numBlobs = 0; 
foreach(item in matrix) 
{ 
    res = Visit(item); 
    if(res > 0) 
    { 
     numBlobs = numBlobs + 1; 
    } 
} 
return numBlobs; 

的訪問函數/方法是這樣的:

Visit(item) 
{ 
    marked = 0; 
    if(item.IsX() && !IsItemMarked(neighbour)) 
    { 
     MarkItemAsVisited(item); 
     marked = 1; 
     foreach(neighbour in GetNeighbours(item)) 
     { 
      marked = marked + Visit(neighbour); 
     } 
    } 
    return marked; 
} 

所有你必須要做的是實現其他fucntions /方法,但他們很簡單。

+0

請在C中給我,這會更容易理解! –

+0

@AkshayAgarwal請自己動手,這將是一個很好的做法。 – helb

+0

Ohkay!反正非常感謝! –

0
public static void main(String[] args) { 
     int[][] matrix = new int[6][5]; 
     System.out.println(matrix.length); 
     for (int i=0; i < matrix.length; i++) { 
      for (int j=0; j < matrix[i].length; j++) { 
       matrix[i][j] = 0; 
      } 
     } 

     matrix[0][3] = 1; 
     matrix[1][1] = 1; 
     matrix[1][3] = 1; 
     matrix[2][1] = 1; 
     matrix[2][2] = 1; 
     matrix[2][3] = 1; 
     matrix[4][0] = 1; 
     matrix[4][4] = 1; 
     matrix[5][2] = 1; 
     matrix[5][3] = 1; 
     matrix[5][4] = 1; 

     System.out.println(findBlobCount(matrix, matrix.length, matrix[0].length)); 
    } 

    static int findBlobCount (int matrix[][], int rowCount, int colCount) 
    { 
     int visited[][] = new int[rowCount][colCount]; // all initialized to false 

     int count=0; 

     for (int i=0; i<rowCount; i++) 
     { 
      for (int j=0; j<colCount; j++) 
      { 
       if (matrix[i][j] == 1 && visited[i][j] == 0) // unvisited black cell 
       { 
        markVisited (i,j, matrix, visited, rowCount, colCount); 
        count++; 
       } 
      } 
     } 

     return count; 
    } 


    static int markVisited (int i, int j, int [][]matrix, int [][]visited, int rowCount, int colCount) 
    { 
     if (i < 0 || j < 0) 
      return 0; 

     if (i >= rowCount || j >= colCount) 
      return 0; 

     if (visited[i][j] == 1) // already visited 
      return 1; 

     if (matrix[i][j] == 0) // not a black cell 
      return 0; 

     visited[i][j] = 1; 

     // recursively mark all the 4 adjacent cells - right, left, up and down 
     return markVisited (i+1, j, matrix, visited, rowCount, colCount) 
       + markVisited (i-1, j, matrix, visited, rowCount, colCount) 
       + markVisited (i, j+1, matrix, visited, rowCount, colCount) 
       + markVisited (i, j-1, matrix, visited, rowCount, colCount); 
    }