#include #include #define rep(i, n) for(int i = 0; i < (n); ++i) using namespace std; const int inf = 1e4; struct E{ int t, c, r; }; int n, m; string s[50]; vector g[2502]; bool u[2502]; int encode(int i, int j){ return i * m + j; } void add_edge(int f, int t){ g[f].push_back({t, 1, (int)g[t].size()}); g[t].push_back({f, 0, (int)g[f].size() - 1}); } void make_graph(){ rep(i, n){ rep(j, m){ if(s[i][j] == 0){ add_edge(encode(n, 0) ,encode(i, j)); } else if(s[i][j] == 1){ add_edge(encode(i, j), encode(n, 1)); } if(i + 1 < n && s[i][j] + s[i + 1][j] == 1){ int p = encode(i, j), q = encode(i + 1, j); if(s[i][j] == 0){ add_edge(p, q); } else{ add_edge(q, p); } } if(j + 1 < m && s[i][j] + s[i][j + 1] == 1){ int p = encode(i, j), q = encode(i, j + 1); if(s[i][j] == 0){ add_edge(p, q); } else{ add_edge(q, p); } } } } } int dfs(int v, int t, int f){ if(v == t){ return f; } u[v] = true; for(E& e: g[v]){ if(!u[e.t] && e.c > 0){ int d = dfs(e.t, t, min(f, e.c)); if(d > 0){ e.c -= d; g[e.t][e.r].c += d; return d; } } } return 0; } int max_flow(int s, int t){ int mf = 0; while(1){ fill_n(u, n * m + 2, false); int f = dfs(s, t, inf); if(f == 0){ return mf; } mf += f; } } int main(){ cin >> n >> m; rep(i, n){ cin >> s[i]; rep(j, m){ s[i][j] = s[i][j] != '.' ? s[i][j] == 'w' : 2; } } make_graph(); int k = max_flow(encode(n, 0), encode(n, 1)); int b = -k, w = -k; rep(i, n){ rep(j, m){ if(s[i][j] == 0){ ++b; } else if(s[i][j] == 1){ ++w; } } } int l = min(b, w); cout << k * 100 + l * 10 + (b + w - 2 * l) << endl; return 0; }