0

次のコードを実行すると、無限ループが発生しました。ブロックで囲まれたグリッド内で、この実装が実行される定義済みの正方形が開始されます。正方形は、訪問する必要がある場合は 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++;
            }
        }
    }
}
4

1 に答える 1

0

私はあなたのコードをランダムなデータで実行しました(エッジは「X」です)。ループには遭遇しませんでした。

また、問題が発生する理由もありません。すべての反復ですべてのピクセルがチェックされ、すべての「1」が「2」に変更されることが保証されます。戻る方法はありません。ループすることはできません。

プログラムの動作に関する詳細情報を提供できるかもしれません。

ところで:あなたのコードには小さな癖があります。サイクル中にすでにマップを作成しているため、フラッドは下部と右側に非常に速くいっぱいになります (説明が難しい -> 例)

  • サイクルの開始: create[2][2]=='1' を除くすべてが ' ' です
  • create[2][2] まですべての要素をチェックし、「1」を隣接要素に、「2」を自己要素に書き込みます
  • 次の要素、つまり create[2][3] をチェックします。これも '1' であり、隣接要素を埋めます

したがって、最初のサイクルの後、create[2][2]=='2' のみが期待されますが、その右および下のすべても =='2' です。

現時点ではコードが壊れることはありませんが、何かを変更すると予期しない結果が生じる可能性があります。

于 2012-06-12T08:33:54.587 に答える