1 条题解
-
1
观测最大星云
题意
给定一个 n * m 的网格:
"."表示普通宇宙区域;
"*"表示星星。
如果若干个星星在上下左右方向上两两连通,那么它们可以看成同一个星云。
求最大星云中星星数量的最大值。
思路
这是经典的网格连通块问题。
遍历整个网格,当遇到一个尚未访问过的 * 时,就从它开始进行 BFS 或 DFS,统计这个连通块中有多少颗星星,并更新答案。
由于 n, m <= 1000 ,网格最多有 10^6 个点。递归 DFS 可能爆栈,因此推荐使用队列 BFS 。
复杂度
时间复杂度: O(nm)
空间复杂度: O(nm)
参考代码:#include<bits/stdc++.h> using namespace std; int n,m; char mp[1050][1050]; int vis[1050][1050]; int fx[4][2]={0,1,1,0,0,-1,-1,0}; int bfs(int x,int y){ queue<array<int,2>> que; que.push({x,y}); vis[x][y]=1; int res=0; while(que.size()){ int x=que.front()[0]; int y=que.front()[1]; que.pop(); res++; for(int i=0;i<4;i++){ int xx=x+fx[i][0]; int yy=y+fx[i][1]; if(xx>n||xx<1||yy>m||yy<1||vis[xx][yy]||mp[xx][yy]=='.') continue; vis[xx][yy]=1; que.push({xx,yy}); } } return res; } int main() { // freopen("test9.in","r",stdin); // freopen("test9.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>mp[i][j]; } } int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(vis[i][j]||mp[i][j]=='.') continue; ans=max(ans,bfs(i,j)); } } cout<<ans;求赞,谢谢!
- 1
信息
- ID
- 2937
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 146
- 已通过
- 32
- 上传者