#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e15;
int n, m;
char a[1005][15];
long long dp[2][1 << 10][2];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
if (!(cin >> n >> m)) return 0;
for (int i = 0; i < n; i++) cin >> a[i];
int cur = 0;
for (int s = 0; s < (1 << m); s++)
for (int h = 0; h < 2; h++) dp[cur][s][h] = INF;
dp[cur][0][0] = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int nxt = 1 - cur;
for (int s = 0; s < (1 << m); s++)
for (int h = 0; h < 2; h++) dp[nxt][s][h] = INF;
for (int mask = 0; mask < (1 << m); mask++) {
for (int h = 0; h < 2; h++) {
if (dp[cur][mask][h] >= INF) continue;
long long val = dp[cur][mask][h];
int from_up = (mask >> j) & 1;
if (a[i][j] == '.') {
// Ô trống: bắt buộc mask[j]=0 và h=0
int nxt_mask = mask & ~(1 << j);
dp[nxt][nxt_mask][0] = min(dp[nxt][nxt_mask][0], val);
} else {
// Phương án 1: Dán DỌC
// Tiếp tục đoạn dọc từ trên hoặc tạo mới. Ngắt ngang (h=0)
int nxt_mask_v = mask | (1 << j);
dp[nxt][nxt_mask_v][0] = min(dp[nxt][nxt_mask_v][0], val + (from_up ? 0 : 1));
// Phương án 2: Dán NGANG
// Bắt buộc ngắt mạch dọc từ trên xuống (mask[j]=0)
// Tiếp tục đoạn ngang từ trái hoặc tạo mới
int nxt_mask_h = mask & ~(1 << j);
dp[nxt][nxt_mask_h][1] = min(dp[nxt][nxt_mask_h][1], val + (h ? 0 : 1));
}
}
}
cur = nxt;
}
// Hết hàng: h phải về 0
for (int mask = 0; mask < (1 << m); mask++) {
dp[cur][mask][0] = min(dp[cur][mask][0], dp[cur][mask][1]);
dp[cur][mask][1] = INF;
}
}
long long ans = INF;
for (int mask = 0; mask < (1 << m); mask++) ans = min(ans, dp[cur][mask][0]);
cout << ans << endl;
return 0;
}