#include<bits/stdc++.h>
using namespace std;
int dy[5]={0,-1,0,1,0};
int dx[5]={0,0,1,0,-1};
int H,W,N;
string str;
char t[16][16];
int d[14][14][14][14][14][14];
int sy[3],sx[3],ty[3],tx[3];

struct state{
  int y0,x0,y1,x1,y2,x2;
};

int solve(){
  state s;
  s.y0=sy[0];s.x0=sx[0];
  s.y1=sy[1];s.x1=sx[1];
  s.y2=sy[2];s.x2=sx[2];
  
  for(int i=0;i<H-2;i++)
    for(int j=0;j<W-2;j++)
      for(int i2=0;i2<H-2;i2++)
        for(int j2=0;j2<W-2;j2++)
          for(int i3=0;i3<H-2;i3++)
            for(int j3=0;j3<W-2;j3++)
              d[i][j][i2][j2][i3][j3]=1e9;
  
  d[s.y0][s.x0][s.y1][s.x1][s.y2][s.x2]=0;
  
  queue< state > Q;
  
  Q.push(s);

  while(!Q.empty()){
    //if(Tc++ >10) break;
    
    s=Q.front();Q.pop();
    
    int cost=d[s.y0][s.x0][s.y1][s.x1][s.y2][s.x2];

    int y0=s.y0,x0=s.x0;
    int y1=s.y1,x1=s.x1;
    int y2=s.y2,x2=s.x2;
    /*
    cout<<cost<<' '<<y0<<' '<<x0<<' '<<y1<<' '<<x1<<endl;
    for(int i=0;i<H-1;i++){
      for(int j=0;j<W-1;j++){
        if(i==y0&&j==x0)cout<<'a';
        else if(i==y1&&j==x1)cout<<'b';
        else if(i==y2&&j==x2)cout<<'c';
        else if('a'<=t[i][j]&&t[i][j]<='c')cout<<' ';
        else if('A'<=t[i][j]&&t[i][j]<='C')cout<<' ';
        else cout<<t[i][j];
      }
      cout<<endl;
    }
    cout<<endl;
    */
    bool flg=true;

    if(s.y0!=ty[0])flg=false;
    if(s.x0!=tx[0])flg=false;
    if(s.y1!=ty[1]&&N>=2)flg=false;
    if(s.x1!=tx[1]&&N>=2)flg=false;
    if(s.y2!=ty[2]&&N>=3)flg=false;
    if(s.x2!=tx[2]&&N>=3)flg=false;
    if(flg)return cost;
    
    
    for(int i=0;i<5;i++){
      if(N==1&&i==0)continue;
      int ny0=s.y0+dy[i];
      int nx0=s.x0+dx[i];
      if(ny0 < 0 || nx0 < 0 || ny0 >=H-2 || nx0 >=W-2 )continue;
      if(t[ny0][nx0]=='#')continue;
      
      for(int j=0;j<5;j++){
        if(N==1&&j>0)continue;
        int ny1=s.y1+dy[j];
        int nx1=s.x1+dx[j];
        if(ny1 < 0 || nx1 < 0 || ny1 >=H-2 || nx1 >=W-2 )continue;
        if(t[ny1][nx1]=='#')continue;
        
        for(int k=0;k<5;k++){
          if(N<=2&&k>0)continue;
          int ny2=s.y2+dy[k];
          int nx2=s.x2+dx[k];
          if(ny2 < 0 || nx2 < 0 || ny2 >=H-2 || nx2 >=W-2 )continue;
          if(t[ny2][nx2]=='#')continue;
          
          if( ny0 == ny1 && nx0 == nx1 &&N>=2)   continue; 
          if( ny1 == ny2 && nx1 == nx2 &&N==3)   continue;
          if( ny2 == ny0 && nx2 == nx0 &&N==3)   continue;
          

          if( ny0 == s.y1 && nx0 == s.x1 &&
              ny1 == s.y0 && nx1 == s.x0 &&N>=2)continue;
          

          if( ny1 == s.y2 && nx1 == s.x2 &&
              ny2 == s.y1 && nx2 == s.x1 &&N==3)continue;

          if( ny2 == s.y0 && nx2 == s.x0 &&
              ny0 == s.y2 && nx0 == s.x2 &&N==3)continue;
          /*
          if(ny0==1 && nx0==1 && ny1==1 && nx1==2){
            cout<<y0<<' '<<x0<<' '<<y1<<' '<<x1<<' '<<'!'<<endl;
          }
          */
          if( d[ny0][nx0][ny1][nx1][ny2][nx2]>cost+1){
            d[ny0][nx0][ny1][nx1][ny2][nx2]=cost+1;
            Q.push( (state){ny0,nx0,ny1,nx1,ny2,nx2} );
          }
        }
      }
    }
  }
  return -1;
}

int main(){
  while(1){
    cin>>W>>H>>N;
    if(H==0&&W==0&&N==0)break;
    cin.ignore();

    for(int i=0;i<3;i++)
      sy[i]=sx[i]=ty[i]=tx[i]=0;
    
    for(int i=0;i<H;i++){
      getline(cin,str);
      for(int j=0;j<W;j++){
        if(i>0&&j>0){
          t[i-1][j-1]=str[j];
          if('a'<=str[j]&&str[j]<='c'){
            sy[ str[j]-'a' ]=i-1;
            sx[ str[j]-'a' ]=j-1;
          }
          if('A'<=str[j]&&str[j]<='C'){
            ty[ str[j]-'A' ]=i-1;
            tx[ str[j]-'A' ]=j-1;
          }
        }
      }
    }


        
    cout<<solve()<<endl;
  }
  
  return 0;
}

Measured memory_bytes: 36580