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;
	int bk;
	int wt;

	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.emplace_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.assign(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.assign(H,vector<bool>(W,false));}


	void dfs(Point p){
		if(is_visited(p))return;
		set_visited(p,true);
		for(auto&& u:get_near(p)){
		if(in_board(u) && !is_visited(u) && get_char(p)!=get_char(u)){
				 
				if(get_char(u)=='.'){wt++;}
				else if(get_char(u)=='#'){bk++}
				dfs(u);
		}
		}
	}

	int do_all_dfs(){
		ans=0;
		init_visited;
		for (int i;i<H;i++)for(int j=0;j<W;j++){
		wt=0,bk=0;
		Point p(i,j);
		if(get_char(p)=='#' && ! is_visited(p)){
		bk++;
	//		cout<<"b "<<p.h<<" "<<p.w<<endl;
	//	init_visited();
		dfs(p);
		ans+=bk*wt;
		}}
		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_char(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:40:55: warning: no return statement in function returning non-void [-Wreturn-type]
   40 |         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:44:62: warning: no return statement in function returning non-void [-Wreturn-type]
   44 |         int  set_visited(Point p,bool i){visited[p.h][p.w]=i;}
      |                                                              ^
a.cc: In member function 'void Board::dfs(Point)':
a.cc:55:63: error: expected ';' before '}' token
   55 |                                 else if(get_char(u)=='#'){bk++}
      |                                                               ^
a.cc: In member function 'int Board::do_all_dfs()':
a.cc:63:17: error: invalid use of non-static member function 'void Board::init_visited()'
   63 |                 init_visited;
      |                 ^~~~~~~~~~~~
a.cc:45:14: note: declared here
   45 |         void init_visited(){visited.assign(H,vector<bool>(W,false));}
      |              ^~~~~~~~~~~~