include
include
include
include
using namespace std;
struct point {
int x;
int y;
point() {}
point(int _x, int _y) {
x = _x;
y = _y;
}
bool operator< (point p) const {
if (p.x < x)
return true;
else if (p.x == x)
return p.y < y;
else
return false;
}
bool operator== (point p) const {
return (x == p.x && y == p.y);
}
};
point dfs(point head, int& min_x, int& min_y, int& max_x, int& max_y);
point dfs(point head);
double dist(point& p1, point& p2);
int h, w;
char visible[501][501] = { 0 };
char image[501][501];
int main() {
int m = 0;
int s = 0;
cin >> h >> w;
for (int i = 0; i < h; i++) {
for(int j = 0; j < w; j++) {
cin >> image[i][j];
}
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (image[i][j] == '.' || visible[i][j] == 1)
continue;
int min_x = i, min_y = j, max_x = i, max_y = j;
point node = point{ i, j };
point p1 = dfs(node, min_x, min_y, max_x, max_y);
point p2 = dfs(p1, min_x, min_y, max_x, max_y);
point middle = point{ (p1.x + p2.x) / 2, (p1.y + p2.y) / 2 };
point center = point{ (min_x + max_x) / 2, (min_y + max_y) / 2 };
double dist1 = dist(p1, p2);
double dist2 = dist(middle, center);
if (dist2 / dist1 < 0.4)
s++;
else
m++;
}
}
cout << m << ' ' << s;
return 0;
}
point dfs(point head, int& min_x, int& min_y, int& max_x, int& max_y) {
int move[8][2] = { {1, 0}, {1, 1}, {1, -1}, {-1, 0}, {-1, 1}, {-1, -1}, {0, 1}, {0, -1} };
queue q;
set s;
q.push(head);
s.insert(head);
visible[head.x][head.y] = 1;
point tmp;
while (!q.empty()) {
tmp = q.front();
q.pop();
for (int i = 0; i < 8; i++) {
int x = tmp.x + move[i][0];
int y = tmp.y + move[i][1];
point node = point{ x, y };
if (x >= 0 && x < h && y >= 0 && y < w && image[x][y] == '#' && s.count(node) == 0) {
q.push(node);
s.insert(node);
visible[x][y] = 1;
min_x = x < min_x ? x : min_x;
max_x = x > max_x ? x : max_x;
min_y = y < min_y ? y : min_y;
max_y = y > max_y ? y : max_y;
}
}
}
return tmp;
}
double dist(point& p1, point& p2) {
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}