FloodFill(泛洪演算法)

2021-07-25 22:13:15 字數 1566 閱讀 5529

泛洪演算法圖形處理中的乙個填充演算法,我們可以設想這樣乙個場景,windows的畫圖軟體中的油漆桶為乙個形狀著色,該形狀的範圍內都將被著色,我們所使用的演算法就是從乙個畫素點出發,以此向周邊的畫素點擴充著色,直到圖形的邊界。這個場景我們使用的演算法就是flood fill(泛洪演算法)。

泛洪演算法有3中不同的方式,每種演算法有兩種形式一種是遞迴的一種是非遞迴的。一般來說對於遞迴的演算法我們比較容易實現,但是若所需處理的物件非常大,遞迴演算法非常消耗記憶體。下面我們將介紹這幾種演算法:

(1)四鄰域泛洪演算法

四鄰域泛洪演算法的思想是對於畫素點(x,y),將其著色之後將其周圍的上下左右四個點分別進行著色。其遞迴方式為:

void floodfill4(int x, int y, int newcolor, int oldcolor)

}

遞迴方式非常消耗記憶體,若所需著色的面積非常大,會導致溢位現象。因此,下面我們將介紹四鄰域泛洪演算法的非遞迴方式。這裡我們使用乙個棧來儲存未被著色的點,然後依次將存在於著色空間內的點的上下左右的點加入棧,依次著色直到棧為空。

void floodfill4stack(int x, int y, int newcolor, int oldcolor)

; static const int dy[4] = ;

if(!push(x, y)) return;

while(pop(x, y))

}}}

(2)八鄰域泛洪演算法

八鄰域演算法是將乙個畫素點的上下左右,左上,左下,右上,右下都進行著色。該演算法的遞迴方式為:

void floodfill8(int x, int y, int newcolor, int oldcolor)

}

非遞迴方式為:

void floodfill8stack(int x, int y, int newcolor, int oldcolor)

; static const int dy[8] = ;

if(!push(x, y)) return;

while(pop(x, y))

}}}

(3)掃瞄線演算法

該演算法的過程是:先將一條線上的畫素點進行著色,然後依次向上下擴張,直到著色完成。該演算法的遞迴方式為:

void floodfillscanline(int x, int y, int newcolor, int oldcolor)

x1=x;

while(x10&&screen[x1][y]==newcolor)

x1=x;

while(x10&&screen[x1][y]==newcolor)

}

該演算法的非遞迴方式為:

void floodfillscanline(int x, int y, int newcolor, int oldcolor)

else if(spanabove&&y>0&&screen[x1][y-1]!=oldcolor)

if(!spanbelow&&y

泛洪演算法 LeetCode200

給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。示例 1 輸入 11110 11010 11000 00000輸出 1 floodfill 演算法通常譯作 洪水灌溉法 它是一種...

flood fill演算法 筆記

flood fill演算法筆記 僅供學習 bfs 最短路徑 dfs 更方便 有一間長方形的房子,地上鋪兩種顏色的正方形瓷磚。你站在其中一塊綠色的瓷磚上,只能向相鄰 上下左右四個方向 的綠色瓷磚移動。bfswhile 佇列非空 有一間長方形的房子,地上鋪了紅色 黑色兩種顏色的正方形瓷磚。你站在其中一塊...

MAC泛洪攻擊

先來解釋一下啥是泛洪攻擊 交換機裡有一張專門記錄mac位址的表,為了完成資料的快速 該錶具有自動學習機制 泛洪攻擊即是攻擊者利用這種學習機制不斷傳送不同的mac位址給交換機,充滿整個mac表,此時交換機只能進行資料廣播,攻擊者憑此獲得資訊。簡單的來說就是將學習mac的表佔滿,然後如果有正常的資料過來...