#include using namespace std; #define FOR(i,l,r) for(int i = (l);i < (r);i++) #define PB push_back #define MP make_pair #define ALL(x) (x).begin(),(x).end() typedef long long ll; int N,M; vector board; int max_cost [50] [50]; bool vis [50] [50]; const int dx [] = {0,1,0,-1}; const int dy [] = {-1,0,1,0}; bool in_range(int y,int x) { return y >= 0 && y < N && x >= 0 && x < M; } pair bfs(int ny,int nx) { queue< pair > q; deque< deque > seen(N,deque(M,false)); q.push(MP(ny,nx)); pair res; while(q.empty() == false){ int y = q.front().first,x = q.front().second; q.pop(); if(seen [y] [x]) continue; seen [y] [x] = true; res = MP(y,x); FOR(i,0,4){ int yy = y + dy [i],xx = x + dx [i]; if(in_range(yy,xx) && board [yy] [xx] != '.'){ q.push(MP(yy,xx)); } } } return res; } int dfs(int y,int x,bool flag) { if(vis [y] [x] == true) return 0; if(board [y] [x] == '.') return 0; vis [y] [x] = true; int res = 0; FOR(i,0,4){ int yy = y + dy [i],xx = x + dx [i]; if(in_range(yy,xx)){ res = max(dfs(yy,xx,flag),res); } } vis [y] [x] = flag; return res + 1; } int main() { cin.tie(0); ios::sync_with_stdio(false); cin >> N >> M; board.resize(N); int black = 0,white = 0; FOR(i,0,N){ cin >> board [i]; black += count(ALL(board [i]),'b'); white += count(ALL(board [i]),'w'); } int ans = 0; FOR(i,0,N){ FOR(j,0,M){ if(board [i] [j] == '.' || vis [i] [j] == true) continue; pair pos = bfs(i,j); int y = pos.first,x = pos.second; int res = dfs(y,x,false); ans += res / 2 * 100; black -= res / 2; white -= res / 2; dfs(y,x,true); } } ans += min(black,white) * 10; ans += max(black,white) - min(black,white); cout << ans << endl; return 0; }