#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define MAX 1001
struct node
{
int x;
int y;
int distance;
};
int l, c;
char grid[MAX][MAX], temp;
node clouds[MAX * MAX];
int n_clouds = 0;
int i, u;
int visited[MAX][MAX];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
int n_min, n_max;
inline int max(int a, int b)
{
return a > b ? a : b;
}
inline int min(int a, int b)
{
return a < b ? a : b;
}
void read_input()
{
scanf("%d %d", &l, &c);
for (i = 0; i < l; i++)
{
for (u = 0; u < c; u++)
{
scanf(" %c", &temp);
grid[i][u] = temp;
if (temp == '#')
{
node cloud;
cloud.x = u;
cloud.y = i;
clouds[n_clouds] = cloud;
n_clouds++;
}
}
}
}
void bfs(node start)
{
queue<node> q;
q.push(start);
memset(visited, 0, sizeof visited);
while (!q.empty())
{
node current = q.front();
q.pop();
int x = current.x;
int y = current.y;
int distance = current.distance;
if (x < 0 || y < 0 || x >= c || y >= l || visited[y][x])
{
continue;
}
//printf("x: %d, y: %d\n", x, y);
visited[y][x] = 1;
if (grid[y][x] == 'A')
{
printf("distance: %d\n", distance);
if (n_min == -1)
n_min = distance;
else
n_min = min(n_min, distance);
n_max = max(n_max, distance);
return;
}
node node;
node.distance = distance + 1;
int k;
for (k = 0; k < 4; k++)
{
node.x = x + dx[k];
node.y = y + dy[k];
q.push(node);
//printf("node.x = %d, node.y = %d, k = %d\n", node.x, node.y, k);
}
}
}
int main()
{
read_input();
n_min = -1;
n_max = -1;
for (i = 0; i < n_clouds; i++)
{
bfs(clouds[i]);
}
printf("%d %d\n", n_min, n_max);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHF1ZXVlPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgTUFYIDEwMDEKCnN0cnVjdCBub2RlCnsKICBpbnQgeDsKICBpbnQgeTsKICBpbnQgZGlzdGFuY2U7Cn07CgppbnQgbCwgYzsKY2hhciBncmlkW01BWF1bTUFYXSwgdGVtcDsKbm9kZSBjbG91ZHNbTUFYICogTUFYXTsKaW50IG5fY2xvdWRzID0gMDsKaW50IGksIHU7CmludCB2aXNpdGVkW01BWF1bTUFYXTsKaW50IGR4W10gPSB7LTEsIDAsIDEsIDB9OwppbnQgZHlbXSA9IHswLCAtMSwgMCwgMX07CmludCBuX21pbiwgbl9tYXg7CgppbmxpbmUgaW50IG1heChpbnQgYSwgaW50IGIpCnsKICByZXR1cm4gYSA+IGIgPyBhIDogYjsKfQoKaW5saW5lIGludCBtaW4oaW50IGEsIGludCBiKQp7CiAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Cn0KCnZvaWQgcmVhZF9pbnB1dCgpCnsKICBzY2FuZigiJWQgJWQiLCAmbCwgJmMpOwoKICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQogIHsKICAgIGZvciAodSA9IDA7IHUgPCBjOyB1KyspCiAgICB7CiAgICAgIHNjYW5mKCIgJWMiLCAmdGVtcCk7CiAgICAgIGdyaWRbaV1bdV0gPSB0ZW1wOwoKICAgICAgaWYgKHRlbXAgPT0gJyMnKQogICAgICB7CiAgICAgICAgbm9kZSBjbG91ZDsKICAgICAgICBjbG91ZC54ID0gdTsKICAgICAgICBjbG91ZC55ID0gaTsKCiAgICAgICAgY2xvdWRzW25fY2xvdWRzXSA9IGNsb3VkOwogICAgICAgIG5fY2xvdWRzKys7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZvaWQgYmZzKG5vZGUgc3RhcnQpCnsKICBxdWV1ZTxub2RlPiBxOwogIHEucHVzaChzdGFydCk7CgogIG1lbXNldCh2aXNpdGVkLCAwLCBzaXplb2YgdmlzaXRlZCk7CgogIHdoaWxlICghcS5lbXB0eSgpKQogIHsKICAgIG5vZGUgY3VycmVudCA9IHEuZnJvbnQoKTsKICAgIHEucG9wKCk7CgogICAgaW50IHggPSBjdXJyZW50Lng7CiAgICBpbnQgeSA9IGN1cnJlbnQueTsKICAgIGludCBkaXN0YW5jZSA9IGN1cnJlbnQuZGlzdGFuY2U7CgogICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPj0gYyB8fCB5ID49IGwgfHwgdmlzaXRlZFt5XVt4XSkKICAgIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy9wcmludGYoIng6ICVkLCB5OiAlZFxuIiwgeCwgeSk7CgogICAgdmlzaXRlZFt5XVt4XSA9IDE7CgogICAgaWYgKGdyaWRbeV1beF0gPT0gJ0EnKQogICAgewogICAgICBwcmludGYoImRpc3RhbmNlOiAlZFxuIiwgZGlzdGFuY2UpOwoKICAgICAgaWYgKG5fbWluID09IC0xKQogICAgICAgIG5fbWluID0gZGlzdGFuY2U7CiAgICAgIGVsc2UKICAgICAgICBuX21pbiA9IG1pbihuX21pbiwgZGlzdGFuY2UpOwoKICAgICAgbl9tYXggPSBtYXgobl9tYXgsIGRpc3RhbmNlKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIG5vZGUgbm9kZTsKICAgIG5vZGUuZGlzdGFuY2UgPSBkaXN0YW5jZSArIDE7CgogICAgaW50IGs7CiAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQogICAgewogICAgICBub2RlLnggPSB4ICsgZHhba107CiAgICAgIG5vZGUueSA9IHkgKyBkeVtrXTsKICAgICAgcS5wdXNoKG5vZGUpOwoKICAgICAgLy9wcmludGYoIm5vZGUueCA9ICVkLCBub2RlLnkgPSAlZCwgayA9ICVkXG4iLCBub2RlLngsIG5vZGUueSwgayk7CiAgICB9CiAgfQp9CgppbnQgbWFpbigpCnsKICByZWFkX2lucHV0KCk7CgogIG5fbWluID0gLTE7CiAgbl9tYXggPSAtMTsKICAKICBmb3IgKGkgPSAwOyBpIDwgbl9jbG91ZHM7IGkrKykKICB7CiAgICBiZnMoY2xvdWRzW2ldKTsKICB9CgogIHByaW50ZigiJWQgJWRcbiIsIG5fbWluLCBuX21heCk7CgogIHJldHVybiAwOwp9Cg==