如何计算每组中有效方块的数量?

时间:2015-01-03 10:53:42

标签: c algorithm

编辑:我有一个逻辑错误,我不知道如何解决它。This is my code。我认为问题出在第245行的while函数中。它没有将下一个有效像素添加到队列中,因此队列变为0并退出WHILE函数。

我需要老兵的帮助!我有一个类似棋桌的东西,大小相等,从下到上,从右到左编号,但只有一些对我有效(如图所示,我发布了一个链接)。我从表中删除了无效的。

我希望我的C程序计算每组中的方块。正如您在图像中看到的那样,有效组仅具有直接连接的正方形,而仅对角连接的正方形不在同一组中。我使用颜色来证明我的照片中的有效群体。

我知道桌子的宽度和高度,我知道它有多少个正方形和有效正方形。 我将他们的数字存储在一个向量中,但我无法弄清楚如何计算每组中的方块。 我怎么能这样做?

这是我的照片:

enter image description here

我想找到一种方法,适用于较大的国际象棋桌和#34;,就像已知尺寸的图片一样。

3 个答案:

答案 0 :(得分:0)

你肯定会错过的是:有效广场属于哪个群组?
您可以使用图论来解决这个问题。 但你也可以尝试其他方法。

例如,您可以使用一个标记列表来跟踪已访问过的节点。您可以使用向量向量来管理组节点。

  1. 以相同方向浏览表格,让我们从左上角到右下角说。仅检查未访问的节点。
  2. 当找到未访问的有效方块时,将此节点添加到vector [count ++]并将此节点标记为已访问。
  3. 在右下方向查找此节点连接的方块。如果找到一个,则将其标记为已访问,并将该节点添加到相同的向量[count]列表中。
  4. 您重复相同的过程,直到找不到连接的组件(例如,使用递归)。
  5. 如果在同一组中找不到连接的方块,请继续步骤1.
  6. 最后只是每个向量[count]的总和,它应该给出预期的结果(对于性能,你可以在查看连接的组件时动态执行)。

答案 1 :(得分:0)

您应该将每个连接的方块分类为单个组件并计算每个组件的大小。为此,您可以使用嵌套数据结构(例如vector)来存储连接的正方形并将其嵌套在map内以区分其他连接的正方形。等,

map<int squareIndex, vector<squares> >

基本思想是拥有一个visited数组,以便您可以忽略已经访问过的方块。该算法就像在Breadth First Search中执行Graphs一样。您可以使用Queue存储当前方块的相邻连接组件。我建议你做以下几点。

<强> ALGO

  1. 遍历数组从1到N
  2. 如果队列为空,则在map中创建新索引并将元素推送到map
  3. 如果访问[element]为true,则转到步骤1,否则访问[element] = true并将元素推送到地图中。
  4. element = dequeue()
  5. 将当前元素的相邻方块排队,并从步骤2开始重复当前元素
  6. 这样,最终你的map大小为4(对于给定的情况),每个地图元素将包含连接方块的向量。使用每个向量的大小属性来计算每个索引中的平方数。

答案 2 :(得分:-1)

您正在搜索名为connected component的内容。

This post阐明了这一主题,但网上有一些different implementations