2 条题解

  • 0
    @ 2024-6-10 21:39:06

    对于一个没有被遍历过的*点,对其进行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
      @ 2024-6-8 20:34:35
      #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

      [NOI Online #3 入门组] 观星【难】

      信息

      ID
      774
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      82
      已通过
      33
      上传者