2 条题解
-
0
对于一个没有被遍历过的
*
点,对其进行bfs找出此星系内的所有星星,并处理相关的信息。最后遍历找出有几个星系及最大星系大小。#include<bits/stdc++.h> using namespace std; const int N=1505,INF=0x3f3f3f3f,d[8][2]={0,1,1,0,0,-1,-1,0,1,1,-1,-1,1,-1,-1,1}; int n,m,cnt[N*N],sum,ans=-INF; char c[N][N]; bool vis[N][N]; struct node{ int x,y; }; queue<node> q; int bfs(int u,int v){ int cnt=0; vis[u][v]=1; q.push({u,v}); while(!q.empty()){ int x=q.front().x,y=q.front().y; q.pop(); cnt++; for(int i=0;i<8;i++){ int xx=x+d[i][0],yy=y+d[i][1]; if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&!vis[xx][yy]&&c[xx][yy]=='*') vis[xx][yy]=1,q.push({xx,yy}); } } return cnt; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>c[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(c[i][j]=='*'&&!vis[i][j]){ int p=bfs(i,j); cnt[p]+=p; } for(int i=1;i<=n*m;i++) if(cnt[i]) sum++,ans=max(ans,cnt[i]); printf("%d %d",sum,ans); return 0; }
-
0
#include<bits/stdc++.h> using namespace std; const int N=1501; int n,m,k,s,t,tmp,cnt[2250001],mx,ans,f[N][N]; int w[8][2]={0,1,1,0,0,-1,-1,0,1,1,-1,-1,1,-1,-1,1}; char c[N][N]; queue<pair<int,int>>q; void bfs(int x,int y) { f[x][y]=0; q.push({x,y}); while(!q.empty()) { int u=q.front().first,v=q.front().second; q.pop(); tmp+=1; for(int i=0;i<=7;i+=1) { int _u=u+w[i][0],_v=v+w[i][1]; if(_u>=1&&_u<=n&&_v>=1&&_v<=m&&c[_u][_v]=='*'&&f[_u][_v]==1061109567)f[_u][_v]=1,q.push({_u,_v}); } } } int main() { cin>>n>>m; for(int i=1;i<=n;i+=1)cin>>c[i]+1; memset(f,63,sizeof(f)); for(int i=1;i<=n;i+=1)for(int j=1;j<=m;j+=1)if(c[i][j]=='*'&&f[i][j]==1061109567) { tmp=0; bfs(i,j); cnt[tmp]+=tmp; } for(int i=1;i<=n*m;i+=1)if(cnt[i]>0) { ans+=1; mx=max(mx,cnt[i]); } cout<<ans<<' '<<mx<<'\n'; }
- 1
信息
- ID
- 774
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 82
- 已通过
- 33
- 上传者