深度优先搜索:水域大小
问题:你有一个用于表示一片土地的整形矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。
由垂直、水平或对角线相连的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有
池塘的大小,返回值需要从小到大排序。
示例:
输入:
[
[0, 2, 1, 0],
[0, 1, 0, 1],
[1, 1, 0, 1],
[0, 1, 0, 1]
]
输出:
[1, 2, 4]
(隐藏提示1:如果给你一个指代水的单元格的行和列,你如何找到所有相邻的水域?)
(隐藏提示2:尝试使用递归计算含水单元格的数量)
(隐藏提示3:你如何确保不会再一次访问相同的单元格?你可以思考一下深度优先搜索如何在图上工作)
用C++解决如上问题:
class Solution{
public:
vector<int> pondSizes(vector<vecotr<int>> &land)
{
vector<int> res;
for(int i = 0; i < land.size(); i++)
{
for(int j = 0; j < land[i].size(); j++)
{
int count = 0;
if(land[i][j] == 0)
{
dfs(i, j, land, count); //进行一次有效的dfs
if(count != 0) //如果搜索结果不为0,则进行一次有效的计数
res.push_back(count);
}
}
}
sort(res.begin(), res.end()); //对容器中已计数的count进行大小排序
return res;
}
void dfs(int x, int y, vector<vector<int>> &land, int count)
{
land[x][y] = -1; //对水域染色
count++;
ind dx[8] = {0,1,1,1,0,-1,-1,-1}, dy[8] = {1,1,0,-1,-1,-1,0,1}; //以原点为基准的8个方向数组
for(int i = 0; i < 8; i++)
{
int x1 = dx[i] + x;
int y1 = dy[i] + y;
if(x1 >=0 && x1 < land.size() && y1 >= 0 && y1 < land[0].size() && land[x][y] == 0) //在8个方向内且是水塘
dfs(x1, y1, land, count); //继续深度搜索
}
}
};