深度优先搜索:水域大小

问题:你有一个用于表示一片土地的整形矩阵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); //继续深度搜索 } } };

 

posted @ 2020-10-05 10:52  青团青  阅读(202)  评论(0编辑  收藏  举报