{$H+}
CONST
xa: ARRAY[1..4] OF LONGINT = (1, 0, -1, 0);
ya: ARRAY[1..4] OF LONGINT = (0, 1, 0, -1);
xb: ARRAY[1..4] OF LONGINT = (2, 0, -2, 0);
yb: ARRAY[1..4] OF LONGINT = (0, 2, 0, -2);
xc: ARRAY[1..4] OF LONGINT = (1, 1, -1, -1);
yc: ARRAY[1..4] OF LONGINT = (1, -1, 1, -1);
TYPE
poi = RECORD
x, y: LONGINT;
END;
VAR
a: ARRAY[1..1400] OF STRING;
b, b2: ARRAY[1..1400, 1..1400] OF LONGINT;
q: ARRAY[1..1960000] OF poi;
n, res, res2, front, rear: LONGINT;
PROCEDURE init;
VAR
i, j: LONGINT;
BEGIN
READLN(n);
FOR i:=1 TO n DO READLN(a[i]);
res := MAXLONGINT; res2 := MAXLONGINT;
END;
PROCEDURE xxx;
VAR
i, tx, ty, tx2, ty2, tb, tb2, r1, r2: LONGINT;
BEGIN
r1 := -1; r2 := MAXLONGINT;
REPEAT
tx := q[front].x; ty := q[front].y;
tb := b[tx, ty]; tb2 := b2[tx, ty];
IF tb = r1 THEN BREAK;
IF a[tx, ty] = ’A’ THEN
FOR i:=1 TO 4 DO BEGIN
tx2 := tx + xa[i]; ty2 := ty + ya[i];
IF (tx2 < 1) OR (tx2 > n) THEN CONTINUE;
IF (ty2 < 1) OR (ty2 > n) THEN CONTINUE;
IF a[tx2, ty2] = ’*’ THEN CONTINUE;
IF b[tx2, ty2] <> 0 THEN
IF (tb + 1 > b[tx2, ty2]) OR (tb + 1 = b[tx2, ty2]) AND (tb2 + 1 > b2[tx2, ty2]) THEN CONTINUE;
IF b[tx2, ty2] = 0 THEN BEGIN
INC(rear);
q[rear].x := tx2; q[rear].y := ty2;
END;
b[tx2, ty2] := tb + 1;
b2[tx2, ty2] := tb2 + 1;
IF (tx2 = n) AND (ty2 = n) THEN BEGIN
r1 := tb + 1;
IF r1 > res THEN EXIT;
IF tb2 + 1 < r2 THEN r2 := tb2 + 1;
END;
END;
IF a[tx, ty] = ’B’ THEN
FOR i:=1 TO 4 DO BEGIN
tx2 := tx + xb[i]; ty2 := ty + yb[i];
IF (tx2 < 1) OR (tx2 > n) THEN CONTINUE;
IF (ty2 < 1) OR (ty2 > n) THEN CONTINUE;
IF a[tx2, ty2] = ’*’ THEN CONTINUE;
IF b[tx2, ty2] <> 0 THEN
IF (tb + 1 > b[tx2, ty2]) OR (tb + 1 = b[tx2, ty2]) AND (tb2 + 1 > b2[tx2, ty2]) THEN CONTINUE;
IF b[tx2, ty2] = 0 THEN BEGIN
INC(rear);
q[rear].x := tx2; q[rear].y := ty2;
END;
b[tx2, ty2] := tb + 1;
b2[tx2, ty2] := tb2 + 1;
IF (tx2 = n) AND (ty2 = n) THEN BEGIN
r1 := tb + 1;
IF r1 > res THEN EXIT;
IF tb2 + 1 < r2 THEN r2 := tb2 + 1;
END;
END;
IF a[tx, ty] = ’C’ THEN
FOR i:=1 TO 4 DO BEGIN
tx2 := tx + xc[i]; ty2 := ty + yc[i];
IF (tx2 < 1) OR (tx2 > n) THEN CONTINUE;
IF (ty2 < 1) OR (ty2 > n) THEN CONTINUE;
IF a[tx2, ty2] = ’*’ THEN CONTINUE;
IF b[tx2, ty2] <> 0 THEN
IF (tb + 1 > b[tx2, ty2]) OR (tb + 1 = b[tx2, ty2]) AND (tb2 + 2 > b2[tx2, ty2]) THEN CONTINUE;
IF b[tx2, ty2] = 0 THEN BEGIN
INC(rear);
q[rear].x := tx2; q[rear].y := ty2;
END;
b[tx2, ty2] := tb + 1;
b2[tx2, ty2] := tb2 + 2;
IF (tx2 = n) AND (ty2 = n) THEN BEGIN
r1 := tb + 1;
IF r1 > res THEN EXIT;
IF tb2 + 2 < r2 THEN r2 := tb2 + 2;
END;
END;
INC(front);
UNTIL front > rear;
IF r1 = -1 THEN EXIT;
IF (r1 < res) OR (r1 = res) AND (r2 < res2) THEN BEGIN
res := r1; res2 := r2;
END;
END;
BEGIN
init;
IF (n = 1) AND (a[1, 1] <> ’*’) THEN BEGIN WRITE(1); HALT; END;
FILLCHAR(b, SIZEOF(b), 0);
front := 1; rear := 1;
b[1, 1] := 1; b2[1, 1] := 1;
q[1].x := 1; q[1].y := 1;
xxx;
FILLCHAR(b, SIZEOF(b), 0);
front := 1; rear := 1;
b[1, n] := 1; b2[1, n] := 1;
q[1].x := 1; q[1].y := n;
xxx;
FILLCHAR(b, SIZEOF(b), 0);
front := 1; rear := 1;
b[n, 1] := 1; b2[n, 1] := 1;
q[1].x := n; q[1].y := 1;
xxx;
IF res = MAXLONGINT THEN WRITE(’No answer’) ELSE WRITE(res2);
END.