泛洪填充演算法 – 如何在 C++ 中實現 paint 中的 fill()
在這個問題中,我們得到一個表示二維螢幕的二維陣列,螢幕上要填充顏色的畫素座標以及顏色本身。我們的任務是建立一個程式來*對當前畫素及其具有該顏色的所有相鄰畫素進行著色*。
在**繪畫軟體中進行著色**,我們會選擇一種顏色,然後用畫筆點選給定的畫素。
讓我們來看一個例子來理解這個問題。
Input: Sceen[][] =
{{W, W, B, W, W, W, W, W},
{W, W, W, W, W, W, B, B},
{W, B, B, W, W, B, W, W},
{W, Y, Y, Y, Y, B, W, B},
{B, W, W, Y, Y, B, W, B},
{B, W, W, Y, Y, Y, Y, B},
{W, B, W, W, W, Y, W, W},
{W, W, B, B, W, Y, Y, W}};
X = 5, Y = 5, newColor = R.
Output:
{{W, W, B, W, W, W, W, W},
{W, W, W, W, W, W, B, B},
{W, B, B, W, W, B, W, W},
{W, R, R, R, R, B, W, B},
{B, W, W, R, R, B, W, B},
{B, W, W, R, R, R, R, B},
{W, B, W, W, W, R, W, W},
{W, W, B, B, W, R, R, W}};泛洪填充演算法
在這個演算法中,當畫素已經具有選定的先前顏色時,它將被填充為新顏色。如果先前顏色不是先前顏色,則不會填充該畫素。填充畫素後,它將檢查其上、下、左、右畫素以執行相同的操作。瞭解更多資訊,請點選這裡。
解決方案方法
解決這個問題的一種方法是使用遞迴方法。我們將找到需要著色的第一個畫素,然後檢查其所有 4 個相鄰畫素。如果顏色相同,則將其替換為新顏色,並對當前畫素的相鄰畫素重複此操作。如果相鄰畫素的顏色不同,則忽略它。重複這些步驟,直到所有與起始畫素顏色相同的相鄰畫素都被著色。然後停止填充演算法。
示例
程式演示了我們解決方案的工作原理
#include<iostream>
using namespace std;
#define M 8
#define N 8
void fillColorAdj(char screen[][N], int x, int y, char oldColor, char color){
if (x < 0 || x >= M || y < 0 || y >= N)
return;
if (screen[x][y] != oldColor)
return;
if (screen[x][y] == color)
return;
screen[x][y] = color;
fillColorAdj(screen, x+1, y, oldColor, color);
fillColorAdj(screen, x-1, y, oldColor, color);
fillColorAdj(screen, x, y+1, oldColor, color);
fillColorAdj(screen, x, y-1, oldColor, color);
}
void fillColor(char screen[][N], int x, int y, char color){
char oldColor = screen[x][y];
if(oldColor==color) return;
fillColorAdj(screen, x, y, oldColor, color);
}
int main(){
char screen[M][N] = {{'W', 'W', 'B', 'W', 'W', 'W', 'W', 'W'},
{'W', 'W', 'W', 'W', 'W', 'W', 'B', 'B'},
{'W', 'B', 'B', 'W', 'W', 'B', 'W', 'W'},
{'W', 'Y', 'Y', 'Y', 'Y', 'B', 'W', 'B'},
{'B', 'W', 'W', 'Y', 'Y', 'B', 'W', 'B'},
{'B', 'W', 'W', 'Y', 'Y', 'Y', 'Y', 'B'},
{'W', 'B', 'W', 'W', 'W', 'Y', 'W', 'W'},
{'W', 'W', 'B', 'B', 'W', 'Y', 'Y', 'W'},};
int x = 5, y = 5;
char color = 'R';
cout<<"The initial screen cordinates are : \n";
for (int i=0; i<M; i++){
for (int j=0; j<N; j++)
cout<<screen[i][j]<<"\t";
cout<<endl;
}
fillColor(screen, x, y, color);
cout<<"\nThe screen cordinates after coloring are : \n";
for (int i=0; i<M; i++){
for (int j=0; j<N; j++)
cout<<screen[i][j]<<"\t";
cout<<endl;
}
}輸出
The initial screen cordinates are : W W B W W W W W W W W W W W B B W B B W W B W W W Y Y Y Y B W B B W W Y Y B W B B W W Y Y Y Y B W B W W W Y W W W W B B W Y Y W The screen cordinates after coloring are : W W B W W W W W W W W W W W B B W B B W W B W W W R R R R B W B B W W R R B W B B W W R R R R B W B W W W R W W W W B B W R R W
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP