Language: C++

#include <bits/stdc++.h>
using namespace std;

struct Point{
	int h,w;
	Point(){};
	Point(int h_,int w_){
		h=h_,w=w_;
	};
};

Point operator+(const Point& a,const Point& b){return Point(a.h+b.h,a.w+b.w);}

struct Board{

	int H,W;
	vector<string>s ;
	vector<Point>near;
	queue<Point> que;
	vector<vector<int>> dist;
	vector<vector<bool>> visited;
	int ans;

	Board(){};
	Board(int h_,int w_){
		H=h_,W=w_;
		s.resize(H);
		near={{-1,0},{1,0},{0,-1},{0,1}};
		init_dist();
		init_visited();
	};

	bool in_board(Point p){if(0<=p.h && p.h<H && 0<=p.w && p.w<W)return true;else return false;} 
	char get_char(Point p){return s[p.h][p.w];}
	vector<Point> get_near(Point p){vector<Point>ret;for(auto&& u:near)ret.push_back(p+u);return ret;}

	int  get_dist(Point p){return dist[p.h][p.w];}
	int  set_dist(Point p,int i){dist[p.h][p.w]=i;}
	void init_dist(){dist.resize(H,vector<int>(W,-1));}

	int  is_visited(Point p){return visited[p.h][p.w];}
	int  set_visited(Point p,bool i){visited[p.h][p.w]=i;}
	void init_visited(){visited.resize(H,vector<bool>(W,false));}


	void dfs(Point p){
		if(is_visited(p))return;
		set_visited(p);
		for(auto&& u:get_near(p)){
		if(in_board(u) && !is_visited(u) && get_char(p)!=get_char(u)){
				if(get_char(u)=='.')ans++;
				dfs(u);
		}
		}
	}

	int do_all_dfs(){
		ans=0;
		for (int i;i<H;i++)for(int j=0;j<W;j++){
		Point p(i,j);
		if(get_char(p)=='#'){
		init_visited();
		dfs(p);
		}}
		return ans;
	}

	void bfs(){
		while(! que.empty()){
		Point p=que.front();que.pop();	
		for(auto&& u:get_near(p)){
		if(in_board(u) &&get_dist(u)==-1){
			set_dist(u,get_dist(p)+1);
			if(get_cahr(u)=='.')ans++;
			que.push(u);
		}}
		}}

	void do_all_bfs(){for (int i;i<H;i++)for(int j=0;j<W;j++){
		Point p(i,j);
		if(get_dist(p)==-1){
			que.push(p);bfs();
		}
	}
	}
	

};


int main(){
	int h,w;cin>>h>>w;
	Board bd(h,w);
	for(auto&& u:bd.s)cin>>u;
	for(auto&& u:bd.s)cout<<u<<endl;
	cout<<bd.do_all_dfs()<<endl;
}

Compiler output:
a.cc: In member function 'int Board::set_dist(Point, int)':
a.cc:38:55: warning: no return statement in function returning non-void [-Wreturn-type]
   38 |         int  set_dist(Point p,int i){dist[p.h][p.w]=i;}
      |                                                       ^
a.cc: In member function 'int Board::set_visited(Point, bool)':
a.cc:42:62: warning: no return statement in function returning non-void [-Wreturn-type]
   42 |         int  set_visited(Point p,bool i){visited[p.h][p.w]=i;}
      |                                                              ^
a.cc: In member function 'void Board::dfs(Point)':
a.cc:48:28: error: no matching function for call to 'Board::set_visited(Point&)'
   48 |                 set_visited(p);
      |                 ~~~~~~~~~~~^~~
a.cc:42:14: note: candidate: 'int Board::set_visited(Point, bool)'
   42 |         int  set_visited(Point p,bool i){visited[p.h][p.w]=i;}
      |              ^~~~~~~~~~~
a.cc:42:14: note:   candidate expects 2 arguments, 1 provided
a.cc: In member function 'void Board::bfs()':
a.cc:74:28: error: 'get_cahr' was not declared in this scope; did you mean 'get_char'?
   74 |                         if(get_cahr(u)=='.')ans++;
      |                            ^~~~~~~~
      |                            get_char