#include <bits/stdc++.h>
using namespace std;
string mp[30];
int w,h,n;
int cnt;
int X[]={1,-1,0,0,0};
int Y[]={0,0,1,-1,0};
int d[300][300][300];
int deg[300];
int s[4],t[4];
int G[300][5];
int ID(int a,int b,int c)
{
return (a<<16)|(b<<8)|c;
}
bool die(int a,int b,int a2,int b2)
{
return a2==b2||(a2==b&&b2==a);
}
int bfs()
{
queue<int> q;
q.push(ID(s[0],s[1],s[2]));
memset(d,-1,sizeof(d));
d[s[0]][s[1]][s[2]]=0;
while(!q.empty())
{
int f=q.front();
q.pop();
int a=(f>>16)&0xff;
int b=(f>>8)&0xff;
int c=f&0xff;
if(a==t[0]&&b==t[1]&&c==t[2])
{
return d[a][b][c];
}
for(int i=0;i<deg[a];i++)
{
int a2=G[a][i];
for(int j=0;j<deg[b];j++)
{
int b2=G[b][j];
if(die(a,b,a2,b2))
{
continue;
}
for(int k=0;k<deg[c];k++)
{
int c2=G[c][k];
if(die(a,c,a2,c2))
{
continue;
}
if(die(b,c,b2,c2))
{
continue;
}
if(d[a2][b2][c2]!=-1)
{
continue;
}
d[a2][b2][c2]=d[a][b][c]+1;
q.push(ID(a2,b2,c2));
}
}
}
}
return -1;
}
int main()
{
while(cin>>w>>h>>n&&w&&h)
{
getchar();
for(int i=0;i<h;i++)
{
getline(cin,mp[i]);
cout<<mp[i]<<endl;
}
cnt=0;
int x[300],y[300];
int id[20][20];
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(mp[i][j]!='#')
{
x[cnt]=i;
y[cnt]=j;
id[i][j]=cnt;
if(islower(mp[i][j]))
{
s[mp[i][j]-'a']=cnt;
}
else if(isupper(mp[i][j]))
{
t[mp[i][j]-'A']=cnt;
}
cnt++;
}
}
}
for(int i=0;i<cnt;i++)
{
deg[i]=0;
for(int dir=0;dir<5;dir++)
{
int nx=x[i]+X[dir],ny=y[i]+Y[dir];
if(mp[nx][ny]!='#')
{
G[i][deg[i]++]=id[nx][ny];
}
}
}
if(n<=2)
{
deg[cnt]=1;
G[cnt][0]=cnt;
s[2]=t[2]=cnt;
cnt++;
}
if(n<=1)
{
deg[cnt]=1;
G[cnt][0]=cnt;
s[1]=t[1]=cnt;
cnt++;
}
cout<<bfs()<<endl;
}
return 0;
}
总是输出-1