无法发现无限循环背后的原因

时间:2017-02-02 16:20:39

标签: c++ flood-fill

我目前正在开发一个程序,它可以从形成轮廓的文件中读取一组坐标,然后使用泛光填充算法填充它。

以下代码似乎在无限循环中运行,但我似乎无法发现原因。

非常感谢帮助或建议: - )

'hello bye'

1 个答案:

答案 0 :(得分:2)

我部分确定你的算法实际上已经终止了,但只是在很长一段时间后(假设队列有足够的内存)。我需要有关sizes值的更多详细信息才能完全确定。

让我们玩一个小的3x3示例字段并假设整个floor((Node-sizes[1]*sizes[2]*floor(Node/(sizes[1]*sizes[2])))/sizes[1])只是边界检查(它是什么?)。

字段(数字是位置名称):

1 2 3
4 5 6
7 8 9

假设starting_point = 1

  1. MyQue = {1}
    • 访问1,将2和4添加到MyQue
  2. MyQue = {2,4}
    • 访问2,将3和5添加到MyQue
  3. MyQue = {4,3,5}
    • 访问4,将5和7添加到MyQue
  4. MyQue = {3,5,5,7}
    • 访问3,向MyQue添加6
  5. MyQue = {5,5,7,6}
    • 访问5,将6和8添加到MyQue
  6. MyQue = {5,7,6,6,8}
    • 访问5,将6和8添加到MyQue
  7. MyQue = {7,6,6,8,6,8}
    • 访问7,将8添加到MyQue
  8. MyQue = {6,6,8,6,8,8}
    • 访问6,将9添加到MyQue
  9. MyQue = {6,8,6,8,8,9}
    • 访问6,将9添加到MyQue
  10. MyQue = {8,6,8,8,9,9}
    • 访问8,向MyQue添加9
  11. MyQue = {6,8,8,9,9,9}
    • 访问6,将9添加到MyQue
  12. MyQue = {8,8,9,9,9,9}
    • 访问8,向MyQue添加9
  13. MyQue = {8,9,9,9,9,9}
    • 访问8,向MyQue添加9
  14. MyQue = {9,9,9,9,9,9}
    • 访问9
  15. MyQue = {9,9,9,9,9}
    • 访问9
  16. MyQue = {9,9,9,9}
    • 访问9
  17. MyQue = {9,9,9}
    • 访问9
  18. MyQue = {9,9}
    • 访问9
  19. MyQue = {9}
    • 访问9
  20. 我希望这说明算法如何经常重复相同的事情,即使对于一个小字段 - 对于更大的字段大小,这种效果会增加。

    所以你可以做的是确保每个节点只排队一次。我认为评估顺序并不重要,因此您可以使用queue代替set来存储工作集。这将确保每个号码仅在同一时间排队一次。

    您还可以组合队列和设置,以便保持评估顺序。

    set < int > marker;
    queue < int > MyQue;
    
    // ... replace later in code
    // MyQue.push(SomeNode);
    // by
    if (marker.insert(SomeNode).second) {
        MyQue.push(SomeNode);
    }
    

    编辑:稍微更改了if条件。如果marker.insert(SomeNode).second已插入,则true将为SomeNode;如果false已成为该集合的一部分,则SomeNode将为call xpath.bat "connection.config" "//connection/@name" call xpath.bat "connection.config" "//connection/@value"