#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>

using namespace std;

int n,m,najbolje,ax,ay,bx,by,minDubina;
char niz[505][505];
bool moguceA[505][505],moguceB[505][505],posecen[505][505];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};


int dx2[]={1,1,0,1,-1,-1,0,-1};
int dy2[]={1,0,1,-1,-1,0,-1,1};

queue<int> qx;
queue<int> qy;
queue<int> qd;

int bfsKrozZidove(int x,int y)
{
    int dubina;
    qx.push(x);
    qy.push(y);
    qd.push(0);
    posecen[x][y]=1;
    while(qx.size())
    {
        x=qx.front();
        y=qy.front();
//        cout<<"  "<<x<<" "<<y<<endl;
        dubina=qd.front();
        for(int i=0;i<8;i++)
        {
//            cout<<""<<x+dx2[i]<<" "<<y+dy2[i]<<endl;
            if(moguceB[x+dx2[i]][y+dy2[i]])
            {
                return dubina;
            }
            if(niz[x+dx2[i]][y+dy2[i]]!='#' && !posecen[x+dx2[i]][y+dy2[i]] && x+dx2[i]>0 && x+dx2[i]<=n && y+dy2[i]>0 && y+dy2[i]<=n)
            {

                posecen[x+dx2[i]][y+dy2[i]]=1;
                qx.push(x+dx2[i]);
                qy.push(y+dy2[i]);
                qd.push(dubina+1);
            }
        }
        qx.pop();
        qy.pop();
        qd.pop();
    }
}

bool bfsA(int x,int y)
{
    qx.push(x);
    qy.push(y);
    moguceA[x][y]=1;
    while(qx.size())
    {
        x=qx.front();
        y=qy.front();
        for(int i=0;i<4;i++)
        {
            if((niz[x+dx[i]][y+dy[i]]=='.' || niz[x+dx[i]][y+dy[i]]=='A' || niz[x+dx[i]][y+dy[i]]=='B') && !moguceA[x+dx[i]][y+dy[i]])
            {
                moguceA[x+dx[i]][y+dy[i]]=1;
                qx.push(x+dx[i]);
                qy.push(y+dy[i]);
            }
        }
        qx.pop();
        qy.pop();
    }
}

bool bfsB(int x,int y)
{
    qx.push(x);
    qy.push(y);
    moguceB[x][y]=1;
    while(qx.size())
    {
        x=qx.front();
        y=qy.front();
        for(int i=0;i<4;i++)
        {
            if((niz[x+dx[i]][y+dy[i]]=='.' || niz[x+dx[i]][y+dy[i]]=='A' || niz[x+dx[i]][y+dy[i]]=='B') && !moguceB[x+dx[i]][y+dy[i]])
            {
                moguceB[x+dx[i]][y+dy[i]]=1;
                qx.push(x+dx[i]);
                qy.push(y+dy[i]);
            }
        }
        qx.pop();
        qy.pop();
    }
}

int main()
{
//    freopen("unos.txt","r",stdin);
    minDubina=2e9;
    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=n+1;j++)
        {
            niz[i][j]='#';
        }
    }
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>niz[i][j];
            if(niz[i][j]=='A') ax=i,ay=j;
            else if(niz[i][j]=='B') bx=i,by=j;
        }
    }
    bfsA(ax,ay);
    bfsB(bx,by);
//    for(int i=1;i<=n;i++)
//    {
//        for(int j=1;j<=n;j++)
//        {
//            cout<<moguceA[i][j]<<" ";
//        }
//        cout<<endl;
//    }
//    cout<<endl;
//    for(int i=1;i<=n;i++)
//    {
//        for(int j=1;j<=n;j++)
//        {
//            cout<<moguceB[i][j]<<" ";
//        }
//        cout<<endl;
//    }
//    cout<<endl;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(moguceA[i][j])
            {
                minDubina=min(minDubina,bfsKrozZidove(i,j));
//                for(int i=1;i<=n;i++)
//                {
//                    for(int j=1;j<=n;j++)
//                    {
//                        cout<<posecen[i][j]<<" ";
//                    }
//                    cout<<endl;
//                }
//                cout<<endl;
                while(qx.size()) qx.pop();
                while(qy.size()) qy.pop();
                while(qd.size()) qd.pop();
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        posecen[i][j]=0;
            }
        }
    }
    cout<<minDubina<<endl;
}