2011-02-05 15 views
0

私はウィキペディアからこの擬似コード使用して、自分のアプリケーションのための塗りつぶしアルゴリズムを使用することを決定した:私はヒットするまで、実装洪水フィルアルゴリズム

Flood-fill (node, target-color, replacement-color): 
    1. Set Q to the empty queue. 
    2. If the color of node is not equal to target-color, return. 
    3. Add node to Q. 
    4. For each element n of Q: 
    5. If the color of n is equal to target-color: 
    6. Set w and e equal to n. 
    7. Move w to the west until the color of the node to the west of w no longer matches target-color. 
    8. Move e to the east until the color of the node to the east of e no longer matches target-color. 
    9. Set the color of nodes between w and e to replacement-color. 
    10. For each node n between w and e: 
    11. If the color of the node to the north of n is target-color, add that node to Q. 
      If the color of the node to the south of n is target-color, add that node to Q. 
    12. Continue looping until Q is exhausted. 
    13. Return. 
私は大丈夫やった

を「Qになるまでループし続けます疲れた "。 私はそれほど得意ではありません。 Qはどのように使い果たしていますか?

答えて

-1

Qでノードを処理した後(手順11の後、ループを戻す前に)ノードを削除します。最終的にQに要素を追加することをやめ、残りの要素を一度に1つずつ処理します。

+0

しかし、Qにノードを追加すると、Forループの反復の範囲が広がりますか?似たようなシナリオで、もし私がそれをしたら、私はエラーになるかもしれない別の言語があったと思います... – Voldemort

0

これは、反復関数を反復関数に変換する方法です。各ピクセルをスタックにプッシュする代わりに(再帰的に)、それをキューに追加します。あなたはそうです、これは反復の範囲を広げますが、それはあなたがしたいことです。シードの色と一致する新しいピクセルが見つかると拡大し続けます。

私が正しく理解している場合は、「for each」ステートメントを使用している間にキューのサイズを編集することに懸念があります。アルゴリズム擬似コードはこの点で混乱します。それは言う場所:

For each element n of Q: 
... 
Continue looping until Q is exhausted. 

それを考える代わりとして:

while Q is not empty: 
    dequeue element n of Q 
    check the pixels 

これは、キューを排出します。

関連する問題