フラッドフィル(シードフィルとも呼ばれます)は、多次元アレイ内の特定のノードに接続されている領域を決定するアルゴリズムです。

これは、ペイントプログラムの「バケツ」塗りつぶしツールで使用され、接続された同様の色の領域を異なる色で塗りつぶします。また、囲碁やマインスイーパなどのゲームでは、どの部分をクリアするかを決定します。特定の境界領域を色で塗りつぶすために画像に適用すると、境界塗りつぶしとも呼ばれます。

 
塗りつぶしアルゴリズムは、開始ノード、ターゲットカラー、および置換カラーの3つのパラメーターを取ります。

左側の次の行列を検討してください–開始ノードが (3, 9)、ターゲットカラーは “BLACK” 交換色は “GREY”、アルゴリズムは、ターゲットカラーのパスによって開始ノードに接続されているマトリックス内のすべてのノードを検索し、それらを置換カラーに変更します。

 
Flood Fill Algorithm

行列の各セルは1つのピクセルを表すことに注意してください。

Practice this problem

アプローチ1:(BFSを使用)

A queueを使用したベースの実装 幅優先探索(BFS) 以下に擬似コードで示します。

BFS (starting-pixel, replacement-color):

  1. 空のQueueを作成します。
  2. 開始ピクセルをキューに入れ、処理済みとしてマークします。
  3. Queueが空になるまでループします

    1. フロントノードをデキューして処理します。
    2. 現在のピクセル(ポップされたノード)の色を置換の色に置き換えます。
    3. 現在のピクセルの隣接する8つのピクセルすべてを処理し、現在のピクセルと同じ色の有効な各ピクセルをキューに入れます。

アルゴリズムは、C++、Java、およびPythonで次のように実装できます。

C++


ダウンロード  コードを実行する

出力:

 Y  Y  Y  G  G  G  G  G  G  G
 Y  Y  Y  Y  Y  Y  G  C  C  C
 G  G  G  G  G  G  G  C  C  C
 W  W  W  W  W  G  G  G  G  C
 W  R  R  R  R  R  G  C  C  C
 W  W  W  R  R  G  G  C  C  C
 W  B  W  R  R  R  R  R  R  C
 W  B  B  B  B  R  R  C  C  C
 W  B  B  C  B  B  B  B  C  C
 W  B  B  C  C  C  C  C  C  C

Java


ダウンロード  コードを実行する

出力:

[Y, Y, Y, G, G, G, G, G, G, G]
[Y, Y, Y, Y, Y, Y, G, C, C, C]
[G, G, G, G, G, G, G, C, C, C]
[W, W, W, W, W, G, G, G, G, C]
[W, R, R, R, R, R, G, C, C, C]
[W, W, W, R, R, G, G, C, C, C]
[W, B, W, R, R, R, R, R, R, C]
[W, B, B, B, B, R, R, C, C, C]
[W, B, B, C, B, B, B, B, C, C]
[W, B, B, C, C, C, C, C, C, C]

Python


ダウンロード  コードを実行する

出力:

[‘Y’, ‘Y’, ‘Y’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’]
[‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘W’, ‘W’, ‘W’, ‘W’, ‘G’, ‘G’, ‘G’, ‘G’, ‘C’]
[‘W’, ‘R’, ‘R’, ‘R’, ‘R’, ‘R’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘W’, ‘W’, ‘R’, ‘R’, ‘G’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘B’, ‘W’, ‘R’, ‘R’, ‘R’, ‘R’, ‘R’, ‘R’, ‘C’]
[‘W’, ‘B’, ‘B’, ‘B’, ‘B’, ‘R’, ‘R’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘B’, ‘B’, ‘C’, ‘B’, ‘B’, ‘B’, ‘B’, ‘C’, ‘C’]
[‘W’, ‘B’, ‘B’, ‘C’, ‘C’, ‘C’, ‘C’, ‘C’, ‘C’, ‘C’]

提案されたソリューションの時間計算量は O(M × N) とが必要です O(M × N) 余分なスペース、ここで MN 行列の次元です。

アプローチ2:(DFSを使用)

使用できます 深さ優先探索(DFS) この問題を解決するために。アイデアは、マトリックス内のソースノードから開始し、その色を置換色に置き換え、有効な8つの隣接するピクセルすべてを再帰的にに探索し、それらの色を置き換えることです。処理されたすべてのノードの色を置き換えるため、ここでは訪問されたアレイは必要ありません。また、色が異なるため、次回は考慮されません。

アルゴリズムは、C++、Java、およびPythonで次のように実装できます。

C++


ダウンロード  コードを実行する

出力:

 Y  Y  Y  G  G  G  G  G  G  G
 Y  Y  Y  Y  Y  Y  G  C  C  C
 G  G  G  G  G  G  G  C  C  C
 W  W  W  W  W  G  G  G  G  C
 W  R  R  R  R  R  G  C  C  C
 W  W  W  R  R  G  G  C  C  C
 W  B  W  R  R  R  R  R  R  C
 W  B  B  B  B  R  R  C  C  C
 W  B  B  C  B  B  B  B  C  C
 W  B  B  C  C  C  C  C  C  C

Java


ダウンロード  コードを実行する

出力:

[Y, Y, Y, G, G, G, G, G, G, G]
[Y, Y, Y, Y, Y, Y, G, C, C, C]
[G, G, G, G, G, G, G, C, C, C]
[W, W, W, W, W, G, G, G, G, C]
[W, R, R, R, R, R, G, C, C, C]
[W, W, W, R, R, G, G, C, C, C]
[W, B, W, R, R, R, R, R, R, C]
[W, B, B, B, B, R, R, C, C, C]
[W, B, B, C, B, B, B, B, C, C]
[W, B, B, C, C, C, C, C, C, C]

Python


ダウンロード  コードを実行する

出力:

[‘Y’, ‘Y’, ‘Y’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’]
[‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘W’, ‘W’, ‘W’, ‘W’, ‘G’, ‘G’, ‘G’, ‘G’, ‘C’]
[‘W’, ‘R’, ‘R’, ‘R’, ‘R’, ‘R’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘W’, ‘W’, ‘R’, ‘R’, ‘G’, ‘G’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘B’, ‘W’, ‘R’, ‘R’, ‘R’, ‘R’, ‘R’, ‘R’, ‘C’]
[‘W’, ‘B’, ‘B’, ‘B’, ‘B’, ‘R’, ‘R’, ‘C’, ‘C’, ‘C’]
[‘W’, ‘B’, ‘B’, ‘C’, ‘B’, ‘B’, ‘B’, ‘B’, ‘C’, ‘C’]
[‘W’, ‘B’, ‘B’, ‘C’, ‘C’, ‘C’, ‘C’, ‘C’, ‘C’, ‘C’]

提案されたソリューションの時間計算量は O(M × N) とが必要です O(M × N) 余分なスペース、ここで MN 行列の次元です。

 
参照: フラッドフィル–ウィキペディア