#include <cstdio>
#include <memory.h>
const int maxl = 1001;
char s[maxl][maxl];
int n, m, u[maxl][maxl];
int xl, yl, xr, yr;
int dx[8] = {-1, 0, 1, 0, -1, -1, 1, 1};
int dy[8] = {0, 1, 0, -1, -1, 1, 1, -1};
int di[4] = {-1, 0, 1, 0};
int dj[4] = {0, 1, 0, -1};
void walk(int x, int y)
{
if (x < 0 || y < 0 || x >= n || y >= m)
return;
if (s[x][y] != '.')
return;
if (u[x][y])
return;
u[x][y] = 1;
if (x < xl)
xl = x;
if (y < yl)
yl = y;
if (x > xr)
xr = x;
if (y > yr)
yr = y;
for (int i = 0; i < 8; i++)
walk(x + dx[i], y + dy[i]);
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%s", s[i]);
memset(u, 0, sizeof(u));
bool anychanged = true;
while (anychanged) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (s[i][j] == 'X' && !u[i][j]) {
xl = i, xr = i;
yl = j, yr = j;
walk(i, j);
for (int x = xl; x <= xr; x++)
for (int y = yl; y <= yr; y++)
s[x][y] = 'X', u[x][y] = 1;
}
anychanged = false;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (s[i][j] == '.') {
int c = 0;
for (int k = 0; k < 4; k++)
if (i + di[k] >= 0 && j + dj[k] >= 0 && i + di[k] < n && j + dj[k] < m && s[i + di[k]][j + dj[k]] == 'X')
++c;
if (c >= 2)
s[i][j] = 'X', anychanged = true;
}
}
int c = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
c += (s[i][j] == 'X');
printf("%d\n", c);
return 0;
} |