样例:
4 4
…
.###
.#.#
.###
9
#include<bits/stdc++.h>
using namespace std;
vector<char>a[105];
int dir[][2]={{0,1},{-1,0},{0,-1},{1,0}};
int n,m;
int judge(int x,int y){//判断边界
if(x==0||x==n-1||y==0||y==m-1)
return 1;
return 0;
}
void dfs(int x,int y){
if(a[x][y]=='#'||a[x][y]=='o')return ;
a[x][y]='o';
for(int k=0;k<=3;k++){
int tx=x+dir[k][0];
int ty=y+dir[k][1];
if(tx>=0&&tx<=n-1&&ty>=0&&ty<=m-1)
dfs(tx,ty);
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
char x;
cin>>x;
a[i].push_back(x);
}
}
for(int i=0;i<n;i++){//从边界搜
for(int j=0;j<m;j++){
if(judge(i,j)&&a[i][j]=='.')
dfs(i,j);
}
}
int cnt=0;
for(int i=0;i<n;i++){//统计可连通边界个数
for(int j=0;j<m;j++){
if(a[i][j]=='o')
cnt++;
}
}
cout<<n*m-cnt<<endl;
return 0;
}