兩種連通區域
四連通區域:從區域內一點出發,可通過上、下、左、右四個方向的移動組合,在不越出區域的前提下,能到達區域內的任意畫素
八連通區域:從區域內每一畫素出發,可通過八個方向,即上、下、左、右、左上、右上、左下、右下移動的組合,在不越出區域的前提下,能到達區域內的任意畫素。
基本原理
從多邊形區域內部的某一畫素點(稱為種子)開始,由此出發找到區域內的其它所有畫素。
演算法的執行過程:
從(x,y)開始,先檢測該點的顏色,若它與邊界色和填充色均不相同,則用填充色填充該點。然後檢測相鄰位置,以確定它們是否是邊界色和填充色,若不是,則填充該相鄰點。直到檢測完區域邊界範圍內的所有畫素為止。
void zhongzitc4 (int seedx, int seedy, int fcolor, int bcolor)
}
給定乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。
示例 1:
輸入:
11110
11010
11000
00000
輸出: 1
示例 2:
輸入:
11000
11000
00100
00011
輸出: 3
題解:
1、dfs
注意開始先判斷直接返回的情況特殊輸入情況;
遍歷所有點,遇到乙個『1』 就count++,然後開始深搜,標記與該點連線的所有點為『0』。
class
solution
}return
count;
}private
void mydfs(int i, int j)
if(grid[i][j]=='1')}}
2、bfs
耗時比dfs長
如果按照以往,先放入佇列,出隊時再訪問,會超時,改為入隊前先訪問,再入隊,通過。可能是因為,出隊時再訪問,會呼叫封裝物件的 coor.x和coor.y 屬性,增加耗時。
class
solution , , , }; // 表示移動的位置,下,上、右、左
public
int numislands(char gr)
}return
count;
}private
void markbybfs(int x, int y) }}
}}}class
coordinate
}
給定乙個二維的矩陣,包含 『x』 和 『o』(字母 o)。
找到所有被 『x』 圍繞的區域,並將這些區域裡所有的 『o』 用 『x』 填充。
示例:
x x x x
x oo x
x x o x
x o x x
執行你的函式後,矩陣變為:
x x x x
x x x x
x x x x
x o x x
解釋:
被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的 『o』 都不會被填充為 『x』。 任何不在邊界上,或不與邊界上的 『o』 相連的 『o』 最終都會被填充為 『x』。如果兩個元素在水平或垂直方向相鄰,則稱它們是「相連」的。
題解:
本來應該從非邊界上的o
開始遍歷,但需要考慮與邊界字元的連線問題,較為複雜。
轉換思維,遍歷四周邊界,並開始深搜,將與邊界上o
相連的o
,都標記為另一種標記,如*
。
最後遍歷所有位置,將*
變為o
,其他都變為x
。
class solution
if(grid[m-1][i]=='o')
}for(int i=1;i1;i++)
if(grid[i][n-1] == 'o')
}for(int i=0;ifor(int j=0;jif(grid[i][j]=='*')else}}
}private
void
markbydfs(int x, int y)
if(grid[x][y]=='o')}}
種子填充演算法
在多邊形區域內部填充某元素。種子演算法,即從內部某一點開始填充,再遞迴填充周圍的點 上下左右 四連通 直到遇到邊界。void tianchong int x,int y,int color 在實際應用中,出現了遞迴呼叫棧溢位的情況,先在這裡留坑,下次再補上具體的資料吧。基礎演算法在實際應用中,除了上...
掃瞄線種子填充
掃瞄線種子填充演算法的基本過程如下 當給定種子點 x,y 時,首先分別向左和向右兩個方向填充種子點所在掃瞄線上的位於給定區域的乙個區段,同時記下這個區段的範圍 xleft,xright 然後確定與這一區段相連通的上 下兩條掃瞄線上位於給定區域內的區段,並依次儲存下來。反覆這個過程,直到填充結。掃瞄線...
DFS 種子填充問題 藍橋杯 掃雷
你玩過掃雷嗎?這個可愛的小遊戲帶有乙個我們記不清名字的作業系統。遊戲的目標是找到所有地雷在m x n場中的位置。遊戲在乙個正方形中顯示乙個數字,它告訴你在這個正方形附近有多少個地雷。每個方塊最多有八個相鄰方塊。左側的4x 4欄位包含兩個地雷,每個地雷由乙個 字元表示。如果我們用上面描述的提示數來表示...