#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define tiii tuple<int,int,int>
const int MAXN = 505;
const int INF = 1e9 + 5;
int n, h, w;
char a[MAXN][MAXN];
int dp[10][10][MAXN][MAXN];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
bool vis[MAXN][MAXN][4];
pii his[MAXN][MAXN][4];
pii findd(int i, int j, int d)
{
if (his[i][j][d].first != 0)
{
return his[i][j][d];
}
if (vis[i][j][d])
{
return his[i][j][d] = {-1, -1};
}
vis[i][j][d] = true;
int nd = d;
if (a[i][j] == 'C')
{
nd = (d + 1) % 4;
}
else if (a[i][j] == 'A')
{
nd = (d + 3) % 4;
}
int ni = i + dx[nd];
int nj = j + dy[nd];
pii res;
if (ni >= 1 and ni <= h and nj >= 1 and nj <= w and a[ni][nj] != 'x')
{
res = findd(ni, nj, nd);
}
else
{
res = {i, j};
}
vis[i][j][d] = false;
return his[i][j][d] = res;
}
void dijsktra(int l, int r)
{
priority_queue<tiii, vector<tiii>, greater<tiii>> pq;
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
if (dp[l][r][i][j] < INF)
{
pq.push({dp[l][r][i][j], i, j});
}
}
}
while(!pq.empty())
{
auto[d, i, j] = pq.top();
pq.pop();
if (d > dp[l][r][i][j])
{
continue;
}
for (int direct = 0; direct < 4; direct++)
{
auto [ni, nj] = findd(i, j, direct);
if (ni != -1 and nj != -1 and dp[l][r][ni][nj] > dp[l][r][i][j] + 1)
{
dp[l][r][ni][nj] = dp[l][r][i][j] + 1;
pq.push({dp[l][r][ni][nj], ni, nj});
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> w >> h;
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
for (int l = 1; l <= n; l++)
{
for (int r = 1; r <= n; r++)
{
dp[l][r][i][j] = INF;
}
}
}
}
for (int i = 1; i <= h; i++)
{
string s;
cin >> s;
for (int j = 0; j < w; j++)
{
a[i][j + 1] = s[j];
if (a[i][j + 1] >= '0' and a[i][j + 1] <= '9')
{
int cur = a[i][j + 1] - '0';
dp[cur][cur][i][j + 1] = 0;
}
}
}
for (int len = 1; len <= n; len++)
{
for (int l = 1; l + len - 1 <= n; l++)
{
int r = l + len - 1;
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
for (int k = l; k < r; k++)
{
dp[l][r][i][j] = min(dp[l][r][i][j], dp[l][k][i][j] + dp[k + 1][r][i][j]);
}
}
}
dijsktra(l, r);
}
}
int ans = INF;
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
{
ans = min(ans, dp[1][n][i][j]);
}
}
if (ans == INF)
{
cout << -1;
}
else
{
cout << ans;
}
}