[bfs][dfs]面试题 16.19. 水域大小(medium)

编程入门 行业动态 更新时间:2024-10-26 21:26:06

[bfs][dfs]面试题 16.19. <a href=https://www.elefans.com/category/jswz/34/1657201.html style=水域大小(medium)"/>

[bfs][dfs]面试题 16.19. 水域大小(medium)

题目:


题解:

bfs dfs 纯模板题,思路看代码即可。


代码如下:

// 方向数组,由于对角线也算水域范围,所以为8个方向
int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,1,1,1,0,-1,-1,-1};
// 用来标记水域是否被统计过
bool flag[1010][1010];class Solution {
public:void dfs(vector<vector<int>>& land,int i,int j,int& val,int n,int m){// 给(i,j)标记,并将水域小大+1val++;flag[i][j]=1;// 进行8个方向的dfsfor(int k=0;k<8;++k){int x=i+dx[k],y=j+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&!land[x][y]&&!flag[x][y])dfs(land,x,y,val,n,m);}}// 题解1:dfsvector<int> pondSizes_1(vector<vector<int>>& land) {memset(flag,0,sizeof flag);vector<int> res;int n=land.size(),m=land[0].size();// 统计水域大小for(int i=0;i<n;++i)for(int j=0;j<m;++j)if(!land[i][j]&&!flag[i][j])// (i,j)为水域并且没被统计过{int val=0;dfs(land,i,j,val,n,m);res.push_back(val);}sort(res.begin(),res.end());return res;}// 题解2:bfsvector<int> pondSizes(vector<vector<int>>& land){memset(flag,0,sizeof flag);vector<int> res;int n=land.size(),m=land[0].size();for(int i=0;i<n;++i)for(int j=0;j<m;++j){if(!land[i][j]&&!flag[i][j]){res.push_back(bfs(land,i,j,n,m));}}sort(res.begin(),res.end());return res;}int bfs(vector<vector<int>>& land,int i,int j,int n,int m){int val=0;queue<pair<int,int>> q;flag[i][j]=1;q.push({i,j});// 进行bfswhile(!q.empty()){auto t=q.front();q.pop();val++;for(int k=0;k<8;++k){int x=t.first+dx[k],y=t.second+dy[k];// 将没有被访问过的点加入if(x>=0&&x<n&&y>=0&&y<m&&!land[x][y]&&!flag[x][y]){flag[x][y]=1;q.push({x,y});}}}return val;}
};

更多推荐

[bfs][dfs]面试题 16.19. 水域大小(medium)

本文发布于:2023-07-28 18:55:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1280283.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:水域   面试题   大小   bfs   dfs

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!