简单的bfs
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
string s[N];
int mp[][2]={{0,1},{0,-1},{1,0},{-1,0}};
int n,m;
int ans1,ans2,t;
struct point{
int x,y;
};
void bfs( point cnt){
queue<point>q;
q.push(cnt);
// ans1++;
if(s[cnt.x][cnt.y]>'1') t=1;
s[cnt.x][cnt.y]='0';
while(!q.empty()){
point p=q.front();
q.pop();
for(int i=0;i<4;i++){
point next;
next.x=p.x+mp[i][0];
next.y=p.y+mp[i][1];
if(next.x<=0||next.x>n||next.y<=0||next.y>m)continue;
if(s[next.x][next.y]=='0')continue;
if(s[next.x][next.y]>'1')t=1;
s[next.x][next.y]='0';
q.push(next);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];
s[i]=" "+s[i];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(s[i][j]!='0'){
t=0;
bfs({i,j});
ans1++;
if(t==1)ans2++;
}
}
cout<<ans1<<" "<<ans2;
return 0;
}