给定2D数组,例如:

0 0 0 0 0
0 2 3 0 1
0 8 5 0 7
7 0 0 0 4

输出应为群集组:

类别1:<2,3,8,5,7>
类别2:<1,7,4>

最佳答案

您的问题似乎是找到连接的组件。您应该使用遍历方法(BFS或DFS都可以完成工作)。遍历所有元素,对于每个非零元素,开始一个遍历,并记录您在该遍历中看到的所有元素,并将每个访问的元素变为零。类似于以下代码:

void DFS(int x, int y)
{
  printf("%d ", g[x][y]);
  g[x][y] = 0;
  // iterate over neighbours
  for(dx=-1; dx<=1; dx++)
    for(dy=-1; dy<=1; dy++)
      if (g[x+dx][y+dy]) DFS(x+dx, y+dy);
}

for(i=0; i<n; i++)
  for(j=0; j<n; j++)
    if (g[i][j])
    {
      DFS(i, j);
      printf("\n");
    }

关于algorithm - 给定二维数字数组,找到聚类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8664808/

10-13 06:39