题目:
注意:
只要记得相同星星的算一个星系,直接BFS,上代码
#include<bits/stdc++.h>
using namespace std;
#define fir first
#define sec second
#define endl "\n"
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 1510, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
char g[N][N];
int f[N][N];
bool st[N][N];
int n,m;
int res=-1;
int dx[8]={0,0,1,1,1,-1,-1,-1};
int dy[8]={1,-1,1,0,-1,1,0,-1};
set<int> ans;
map<int,int>mp;
// int shu[100000],kt=0;
void bfs(int x,int y){
queue<pii>q;
q.push({x,y});
int cnt=1;
while(!q.empty()){
pii tp=q.front();
q.pop();
for(int i=0;i<8;i++){//8个方向挨个搜
int x1=tp.fir+dx[i],y1=tp.sec+dy[i];
if(x1<1 || x1>n || y1<1 || y1>m) continue;
if(st[x1][y1]) continue;
if(g[x1][y1]=='.') continue;
cnt++;
st[x1][y1]=1;
q.push({x1,y1});
}
}
// shu[kt++]=cnt;
ans.insert(cnt);//统计不同星系,set有去重的作用
mp[cnt]+=cnt;//相同星星的总和
}
void solve()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> g[i][j];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(g[i][j]=='*' && !st[i][j]){
st[i][j]=1;
bfs(i,j);
}
}
}
//忽略我一开始没想到map
/*sort(shu,shu+kt);
int sum=0;
for(int i=0;i<kt-1;i++){
if(shu[i]==shu[i+1]){
sum+=shu[i];
}
else{
sum+=shu[i];
res=max(sum,res);
sum=0;
}
}*/
//求最大值,map真好用
for(auto sum:mp){
res=max(sum.sec,res);
}
cout<<ans.size()<<" "<<res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
//cin >> t;
while(t --)
solve();
return 0;
}