#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
char map[51][51];
int use[51][51];
struct node {
int x,y,data;
}q[3000];
int cmp(const void *x,const void *y){
struct node *p=(node *)x;
struct node *q=(node *)y;
return p->data-q->data;
}
int ans1;
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
void bfs(int a,int b){
int h=0,t=1,i,tx,ty;
use[a][b]=ans1;
q[1].x=a;
q[1].y=b;
q[1].data=ans1;
while(h!=t){
h++;
for(i=0;i<8;i++){
tx=q[h].x+dx[i];
ty=q[h].y+dy[i];
if(tx>0&&tx<=n&&ty>0&&ty<=m&&map[tx][ty]=='#'&&use[tx][ty]==0){
t++;
q[t].x=tx;
q[t].y=ty;
q[t].data=ans1;
use[tx][ty]=ans1;
}
}
}
}
int f[3000];
int gf(int x){
if(f[x]==x)
return x;
return f[x]=gf(f[x]);
}
int main(){
scanf("%d%d\n",&n,&m);
int i,j,k,fa,fb;
char c;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
scanf("%c",&map[i][j]);
scanf("%c",&c);
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(map[i][j]=='#'&&use[i][j]==0){
ans1++;
bfs(i,j);
}
printf("%d\n",ans1);
int s=0;
for(i=1;i<=n+1;i++)
for(j=1;j<=m+1;j++){
for(k=j+2;k<=m;k++){
if(use[i][k]!=use[i][j]&&use[i][j]>0&&use[i][k]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[i][k];
q[s].data=k-j-1;
break;
}
if(use[i-1][k]!=use[i][j]&&use[i][j]>0&&use[i-1][k]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[i-1][k];
q[s].data=k-j-1;
break;
}
if(use[i][k]!=use[i-1][j]&&use[i-1][j]>0&&use[i][k]>0){
s++;
q[s].x=use[i-1][j];
q[s].y=use[i][k];
q[s].data=k-j-1;
break;
}
if(use[i-1][k]!=use[i-1][j]&&use[i-1][j]>0&&use[i-1][k]>0){
s++;
q[s].x=use[i-1][j];
q[s].y=use[i-1][k];
q[s].data=k-j-1;
break;
}
}
for(k=i+2;k<=n;k++){
if(use[k][j]>0&&use[k][j]!=use[i][j]&&use[i][j]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[k][j];
q[s].data=k-i-1;
break;
}
if(use[k][j-1]>0&&use[k][j-1]!=use[i][j]&&use[i][j]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[k][j-1];
q[s].data=k-i-1;
break;
}
if(use[k][j]>0&&use[k][j]!=use[i][j-1]&&use[i][j-1]>0){
s++;
q[s].x=use[i][j-1];
q[s].y=use[k][j];
q[s].data=k-i-1;
break;
}
if(use[k][j-1]>0&&use[k][j-1]!=use[i][j-1]&&use[i][j-1]>0){
s++;
q[s].x=use[i][j-1];
q[s].y=use[k][j-1];
q[s].data=k-i-1;
break;
}
}
}
qsort(q+1,s,sizeof(q[0]),cmp);
int ans=0,sum=0;
for(i=1;i<=ans1;i++)
f[i]=i;
for(i=1;i<=s;i++){
fa=gf(q[i].x);
fb=gf(q[i].y);
if(fa!=fb){
ans++;
sum+=q[i].data;
f[fa]=fb;
}
if(ans==ans1-1)
break;
}
printf("%d %d",ans,sum);
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
char map[51][51];
int use[51][51];
struct node {
int x,y,data;
}q[3000];
int cmp(const void *x,const void *y){
struct node *p=(node *)x;
struct node *q=(node *)y;
return p->data-q->data;
}
int ans1;
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
void bfs(int a,int b){
int h=0,t=1,i,tx,ty;
use[a][b]=ans1;
q[1].x=a;
q[1].y=b;
q[1].data=ans1;
while(h!=t){
h++;
for(i=0;i<8;i++){
tx=q[h].x+dx[i];
ty=q[h].y+dy[i];
if(tx>0&&tx<=n&&ty>0&&ty<=m&&map[tx][ty]=='#'&&use[tx][ty]==0){
t++;
q[t].x=tx;
q[t].y=ty;
q[t].data=ans1;
use[tx][ty]=ans1;
}
}
}
}
int f[3000];
int gf(int x){
if(f[x]==x)
return x;
return f[x]=gf(f[x]);
}
int main(){
scanf("%d%d\n",&n,&m);
int i,j,k,fa,fb;
char c;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
scanf("%c",&map[i][j]);
scanf("%c",&c);
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(map[i][j]=='#'&&use[i][j]==0){
ans1++;
bfs(i,j);
}
printf("%d\n",ans1);
int s=0;
for(i=1;i<=n+1;i++)
for(j=1;j<=m+1;j++){
for(k=j+2;k<=m;k++){
if(use[i][k]!=use[i][j]&&use[i][j]>0&&use[i][k]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[i][k];
q[s].data=k-j-1;
break;
}
if(use[i-1][k]!=use[i][j]&&use[i][j]>0&&use[i-1][k]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[i-1][k];
q[s].data=k-j-1;
break;
}
if(use[i][k]!=use[i-1][j]&&use[i-1][j]>0&&use[i][k]>0){
s++;
q[s].x=use[i-1][j];
q[s].y=use[i][k];
q[s].data=k-j-1;
break;
}
if(use[i-1][k]!=use[i-1][j]&&use[i-1][j]>0&&use[i-1][k]>0){
s++;
q[s].x=use[i-1][j];
q[s].y=use[i-1][k];
q[s].data=k-j-1;
break;
}
}
for(k=i+2;k<=n;k++){
if(use[k][j]>0&&use[k][j]!=use[i][j]&&use[i][j]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[k][j];
q[s].data=k-i-1;
break;
}
if(use[k][j-1]>0&&use[k][j-1]!=use[i][j]&&use[i][j]>0){
s++;
q[s].x=use[i][j];
q[s].y=use[k][j-1];
q[s].data=k-i-1;
break;
}
if(use[k][j]>0&&use[k][j]!=use[i][j-1]&&use[i][j-1]>0){
s++;
q[s].x=use[i][j-1];
q[s].y=use[k][j];
q[s].data=k-i-1;
break;
}
if(use[k][j-1]>0&&use[k][j-1]!=use[i][j-1]&&use[i][j-1]>0){
s++;
q[s].x=use[i][j-1];
q[s].y=use[k][j-1];
q[s].data=k-i-1;
break;
}
}
}
qsort(q+1,s,sizeof(q[0]),cmp);
int ans=0,sum=0;
for(i=1;i<=ans1;i++)
f[i]=i;
for(i=1;i<=s;i++){
fa=gf(q[i].x);
fb=gf(q[i].y);
if(fa!=fb){
ans++;
sum+=q[i].data;
f[fa]=fb;
}
if(ans==ans1-1)
break;
}
printf("%d %d",ans,sum);
return 0;
}