#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
const int N=505;
char base[N][N];
ll sum[N][N];
bool was[N][N];
vector<int> pos[3];
int A,B;
int Move[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void DFS(int x, int y, int t)
{
	if(was[x][y]) return;
	pos[t].pb(x*N+y);
	was[x][y]=1;
	for(int i=0;i<4;i++)
	{
		int X=x+Move[i][0];
		int Y=y+Move[i][1];
		if(base[X][Y]=='.' && !was[X][Y]) DFS(X,Y,t);
	}
}
void Set(int x1, int y1, int x2, int y2, int n)
{
	x2++;y2++;
    x1=max(x1,1);
    y1=max(y1,1);
    x2=min(x2,n+1);
    y2=min(y2,n+1);
    sum[x2][y2]++;
    sum[x1][y1]++;
    sum[x1][y2]--;
    sum[x2][y1]--;
}
int Get(int x1, int y1, int x2, int y2, int n)
{
	x1--;y1--;
    x1=max(x1,0);
    y1=max(y1,0);
    x2=min(x2,n);
    y2=min(y2,n);
    return sum[x2][y2]+sum[x1][y1]-sum[x1][y2]-sum[x2][y1];
}
bool Check(int k, int n, int m)
{
	for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) sum[i][j]=0;
	for(int i=0;i<pos[0].size();i++)
	{
		int x=pos[0][i]/N,y=pos[0][i]%N;
		Set(x-k,y-k,x+k,y+k,n);
	}
	//printf("mid:%i\n",k);
	for(int i=0;i<=n;i++) for(int j=0;j<=n;j++)
	{
		sum[i][j]+=(i>0?sum[i-1][j]:0)+(j>0?sum[i][j-1]:0)-((i>0&&j>0)?sum[i-1][j-1]:0);
		//printf("%i ",sum[i][j]);
		//if(j==n) printf("\n");
	}
	//printf("\n");
	if(m==2)
	{
		pos[2].clear();
		for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) was[i][j]=0;
		for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(sum[i][j]>0) DFS(i,j,2);
		for(int i=0;i<=n;i++) for(int j=0;j<=n;j++)
		{
			if(i==0 || j==0) sum[i][j]=0;
			else sum[i][j]=was[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];//sum[i][j]+=(i>0?sum[i-1][j]:0)+(j>0?sum[i][j-1]:0)-((i>0&&j>0)?sum[i-1][j-1]:0);
		}
	}
	for(int i=0;i<pos[1].size();i++)
	{
		int x=pos[1][i]/N,y=pos[1][i]%N;
		if(m==1)
		{
			if(sum[x][y]>0) return 1;
			for(int j=0;j<4;j++) if(sum[x+Move[j][0]][y+Move[j][1]]>0) return 1;
		}
		else if(m==2)
		{
			if(Get(x-k,y-k,x+k,y+k,n)) return 1;
			if(Get(x-k-1,y-k,x-k-1,y+k,n)) return 1;
			if(Get(x+k+1,y-k,x+k+1,y+k,n)) return 1;
			if(Get(x-k,y-k-1,x+k,y-k-1,n)) return 1;
			if(Get(x-k,y+k+1,x+k,y+k+1,n)) return 1;
		}
	}
	return 0;
}
int main()
{
	int n,m,i,j;
	scanf("%i %i",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%s",base[i]+1);
		for(j=1;j<=n;j++)
		{
			if(base[i][j]=='A') A=i*N+j,base[i][j]='.';
			if(base[i][j]=='B') B=i*N+j,base[i][j]='.';
		}
		//printf(":D\n");
	}
	DFS(A/N,A%N,0);
	if(was[B/N][B%N]) return 0*printf("-1\n");
	DFS(B/N,B%N,1);
	int top=n,bot=1,mid,ans=n;
	while(top>=bot)
	{
		mid=top+bot>>1;
		if(Check(mid,n,m)) top=mid-1,ans=mid;
		else bot=mid+1;
	}
	printf("%i\n",ans);
	return 0;
}