#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

const long double EPS = 1e-10;
const long long INF = 1e18;
const long double PI = acos(-1.0L);
//const ll mod = 1000000007;
struct node {
    int ah, aw, bh, bw, ch, cw;
    node(int _ah, int _aw, int _bh, int _bw, int _ch, int _cw) {
        ah = _ah;
        aw = _aw;
        bh = _bh;
        bw = _bw;
        ch = _ch;
        cw = _cw;
    }
    node() {
        ah = aw = bh = bw = ch = cw = 0;
    }
};
int H, W, N;
int dp[14][14][14][14][14][14];
int dh[5] = {0, 1, -1, 0, 0};
int dw[5] = {0, 0, 0, 1, -1};
string field[14];
string dust;
void solve() {
    H -= 2;
    W -= 2;
    //cerr << H << " " << W << " " << N << endl;
    getline(cin, dust);
    getline(cin, dust);
    for(int h = 0; h < H; h++) {
        getline(cin, field[h]);
        string tmp = field[h].substr(1, W);
        field[h] = tmp;
        //field[h] = field[h].substr(1, W);
        //cerr << h << " " << field[h] << endl;
    }
    getline(cin, dust);
    node s;
    for(int h = 0; h < H; h++) {
        for(int w = 0; w < W; w++) {
            if(field[h][w] == 'a') {
                s.ah = h;
                s.aw = w;
            }
            if(field[h][w] == 'b') {
                s.bh = h;
                s.bw = w;
            }
            if(field[h][w] == 'c') {
                s.ch = h;
                s.cw = w;
            }
        }
    }
    queue<node> que;
    que.push(s);
    for(int h = 0; h < H; h++) {
        for(int w = 0; w < W; w++) {
            for(int k = 0; k < H; k++) {
                for(int l = 0; l < W; l++) {
                    for(int a = 0; a < H; a++) {
                        for(int b = 0; b < W; b++) {
                            dp[h][w][k][l][a][b] = 1e9;
                        }
                    }
                }
            }
        }
    }
    dp[s.ah][s.aw][s.bh][s.bw][s.ch][s.cw] = 0;
    while(!que.empty()) {
        node now = que.front();
        int cost = dp[now.ah][now.aw][now.bh][now.bw][now.ch][now.cw];
        //cerr << now.ah << " " << now.aw << " " << now.bh << " " << now.bw << " " << now.ch << " " << now.cw << " " << cost << endl;
        if(field[now.ah][now.aw] == 'A') {
            if(N <= 1 or field[now.bh][now.bw] == 'B') {
                if(N <= 2 or field[now.ch][now.cw] == 'C') {
                    cout << cost << endl;
                    break;
                }
            }
        }
        que.pop();
        for(int ka = 0; ka < 5; ka++) {
            int newah = now.ah + dh[ka];
            int newaw = now.aw + dw[ka];
            if(newah < 0 or newah >= H) continue;
            if(newaw < 0 or newaw >= W) continue;
            if(field[newah][newaw] == '#') continue;
            for(int kb = 0; kb < 5; kb++) {
                if(N <= 1 and kb >= 1) break;
                int newbh = now.bh + dh[kb];
                int newbw = now.bw + dw[kb];
                if(newbh < 0 or newbh >= H) continue;
                if(newbw < 0 or newbw >= W) continue;
                if(N >= 2) {
                    if(newah == newbh and newaw == newbw) continue;
                    if(newah == now.bh and newaw == now.bw and newbh == now.ah and newbw == now.aw) continue;
                    if(field[newbh][newbw] == '#') continue;
                }
                for(int kc = 0; kc < 5; kc++) {
                    if(N <= 2 and kc >= 1) break;
                    int newch = now.ch + dh[kc];
                    int newcw = now.cw + dw[kc];
                    if(newch < 0 or newch >= H) continue;
                    if(newcw < 0 or newcw >= W) continue;
                    if(N >= 3) {
                        if(newah == newch and newaw == newcw) continue;
                        if(newah == now.ch and newaw == now.cw and newch == now.ah and newcw == now.aw) continue;
                        if(newbh == newch and newbw == newcw) continue;
                        if(newbh == now.ch and newbw == now.cw and newch == now.bh and newcw == now.bw) continue;
                        if(field[newch][newcw] == '#') continue;
                    }
                    if(chmin(dp[newah][newaw][newbh][newbw][newch][newcw], dp[now.ah][now.aw][now.bh][now.bw][now.ch][now.cw] + 1)) {
                        node to(newah, newaw, newbh, newbw, newch, newcw);
                        que.push(to);
                    }
                }
            }
        }
    }
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    while(cin >> W >> H >> N) {
        if(H == 0) break;
        solve();
    }
    return 0;
}


Measured memory_bytes: 38312