#include using namespace std; #define DPRINTF(...) printf(__VA_ARGS_) #define FOR0(i, n) for(int i=0;i(t) #define snd(t) get<1>(t) #define thd(t) get<2>(t) typedef long long ll; int N, M; // H, W vector G[3000]; int match[3000]; bool used[3000]; std::string _map[50]; int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1}; bool dfs(int v){ used[v] = true; FOR0(i, G[v].size()){ int u = G[v][i], w = match[u]; if(w < 0 || !used[w] && dfs(w)){ match[v] = u; match[u] = v; return true; } } return false; } int bipartite_matching(){ int res = 0; memset(match, -1, sizeof(match)); FOR0(v, N*M){ if(match[v] < 0){ memset(used, 0, sizeof(used)); if(dfs(v)){ res++; } } } return res; } int main(){ cin >> N >> M; FOR0(i, N){ cin >> _map[i]; } int cnt[2]; cnt[0] = cnt[1] = 0; FOR0(i, N){ FOR0(j, M){ if(_map[i][j] == '.'){continue;} cnt[(i+j)&1]++; FOR0(k, 4){ int ny = i + dy[k], nx = j + dx[k]; if(ny < 0 || ny >= N || nx < 0 || nx >= M){continue;} if(_map[ny][nx] == '.'){continue;} G[i*M+j].push_back(ny*M+nx); G[ny*M+nx].push_back(i*M+j); } } } int pair_n = bipartite_matching(), pair2_n = std::min(cnt[0], cnt[1]) - pair_n; printf("%d\n", pair_n * 100 + pair2_n * 10 + cnt[0] + cnt[1] - (pair_n + pair2_n) * 2); }