1 条题解

  • 1
    @ 2026-4-26 13:26:57

    观测最大星云
    题意
    给定一个 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;
    

    求赞,谢谢!

    信息

    ID
    2937
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    146
    已通过
    32
    上传者