Java 8, 421 408 403 400400 351 bytes
int M[][],v[][],l,L;m->{int i=(l=m.length)*(L=m[0].length);for(M=m,v=new int[l][L];m[--i%l][i/l]!=65;);return f(i%l,i/l,-1>>>1,-1);};intint fz(int x,int y,int r,int d){if(M[x][y]>65)return r>d?d:r;d+=v[x][y]=1;r=v(x+1,y)x<l&y<L&x>=0&y>=0&&M[x][y]>32&v[x][y]<1?f(x+1x,y,r,d):r;r=v(x,y+1)?r;}int f(int x,y+1int y,int r,int d){return M[x][y]>65?r>d?d:r;r=vr:z(x,y-1,y)?fz(x-1,y,r,d):r;r=vz(x,y-1)?fy+1,z(xx+1,y-1,r,d+=v[x][y]=1),d):r;v[x][y]=0;return r;}boolean v(int x,int yd){return x<l&y<L&x>=0&y>=0&&M[x][y]>32&v[x][y]<1;,d)+(v[x][y]=0);}
-857 bytes thanks to @ceilingcat.
int M[][], // Matrix on class-level, starting uninitialized
v[][], // Visited matrix on class-level, starting uninitialized
l,L; // x and y dimensions on class-level, starting uninitialized
m->{ // Method with integer-matrix as input and integer as return
int i=(l=m.length) // Set `l` to the amount of rows
*(L=m[0].length); // Set `L` to the amount of columns
// And set `i` to the product of the two
for(M=m, // Set `M` to the input-matrix
v=new int[l][L]; // Create the visited-matrix filled with 0s
m[--i%l][i/l]!=65;); // Loop as long as the current cell doesn't contain an 'A'
return f( // Start the recursive method `f` with:
i%l,i/l, // The current cell as the starting x,y-coordinate
-1>>>1, // Integer.MAX_VALUE as starting minimum-distance
-1);} // And -1 as amount of steps
int fz(int x,int y,int r,int d){
// Create theMethod recursive`z` method
to check if(M[x][y]>65)whether we can travel to the given cell
return x<l&y<L&x>=0&y>=0// If the currentx,y-coordinate cellis containswithin 'B':the matrix boundaries,
return&&M[x][y]>32 r>d?d:r; // and Returnthat the minimum ofcurrent thecell min-distancedoes andNOT amountcontain ofa stepsspace,
d+=v[x][y]=1; &v[x][y]<1? // Markand thewe currenthaven't cellvisited asthis visitedcell yet:
f(x,y,r,d) // Return a call to the recursive method //`f` with Andthe increasesame thearguments
amount of steps by: 1 at the same time
r=v(x+1,y)? // IfElse:
we can travel south:
r;} // Return the row
int f(x+1int x,int y,int r,int d):r;{
// Set the min-distance to a recursive call southwards
r=v(x,y+1)? // Create the recursive method `f`
return M[x][y]>65? // If wethe cancurrent travelcell eastcontains 'B':
f(x,y+1,r, r>d?d):r;r // Set the min-distance to a recursive call eastwards
// r=v(x-1,y)? Return the minimum of the min-distance and amount of steps
// : If we can travel north:
f(x-1,y,r,d):r; // Set the min-distance// to aElse:
recursive call northwards
r=vz(x,y-1)?, // If weDo cana travelrecursive west:`z`-call westward,
f z(x,y-1,ry,d):r; // Set the// min-distance to do a recursive `z`-call westwardsnorthward,
v[x][y]=0; z(x,y+1, // Unmark thedo currenta cellrecursive as`z`-call visitedeastward,
return r;} z(x+1,y,r, // And return the amount of stepsdo asa result
booleanrecursive v(int`z`-call xsouthward,int y){
// Method to check whether we can travel to the given celld+=v[x][y]=1),d),d),d)
return x<l&y<L&x>=0&y>=0// If the x,y-coordinate is within the matrix boundaries
&&M[x][y]>32 // Checkafter thatwe've first marked the current cell does NOT contain aas spacevisited
&v[x][y]<1;} +(v[x][y]=0);} // And we haven'tunmark visitedthe thiscurrent cell yetas visited afterwards