使用洪水填充时遇到循环

时间:2012-06-12 01:26:42

标签: c++ infinite-loop flood-fill

运行以下代码时遇到无限循环。在由块包围的网格内部,启动预定义的正方形,该实现运行。如果需要访问,则将正方形标记为1,如果已访问则将其标记为2。我似乎无法找到解决方案,我会喜欢一些有用的提示。

one_count=1;
while(one_count>0){
    for(int i=0;i<24;i++){
        for(int c=0;c<80;c++){
            if(create[i][c]=='1'){
                if(create[i-1][c]==' '){
                    create[i-1][c]='1';
                }
                if(create[i+1][c]==' '){
                    create[i+1][c]='1';
                }
                if(create[i][c-1]==' '){
                    create[i][c-1]='1';
                }
                if(create[i][c+1]==' '){
                    create[i][c+1]='1';
                }
                create[i][c]='2';
            }
        }
    }
    one_count=0;
    for(int i=0;i<24;i++){
        for(int c=0;c<80;c++){
            if(create[i][c]=='1'){
                one_count++;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我在随机数据上运行你的代码(边缘为'X')。我没有遇到任何循环。

也没有理由遇到问题。每次迭代都会检查每个像素,并确保所有'1'都变为'2'。没有办法回来,不可能循环。

也许您可以提供有关该计划行为的更多信息。

<强>顺便说一句: 你的代码中有一个小怪癖。洪水填充到底部和右侧非常快,因为您在周期中已经编写了地图(难以解释 - &gt;示例)

  • 周期开始:除了创建[2] [2] =='1'
  • 之外,一切都是''
  • 检查所有元素,直到创建[2] [2],将'1'写入邻居并将'2'写入自我
  • 检查下一个元素,即创建[2] [3],它也是'1'并填充邻居

所以在第一个周期之后你只能创建[2] [2] =='2',但是右边和下面的所有内容也是=='2'。

目前它不会破坏您的代码,但如果您更改某些内容,可能会导致意外结果。