#include<bits/stdc++.h>
#define debu
using namespace std;
const int maxn=500;
const int dx[4]= {0,0,-1,1};
const int dy[4]= {1,-1,0,0};
string st[20];
vector<int> g[maxn];
int v[maxn][maxn][maxn];
int q[5000][4],d[4],n,m,k;
void init()
{
memset(q,0,sizeof(q));
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
for(int i=0; i<maxn; i++) g[i].clear();
}
void solve()
{
int head=0,tail=1;
v[q[1][0]][q[1][1]][q[1][2]]=1;
while(head<tail)
{
head++;
int nw[3],nt[3];
for(int i=0; i<3; i++)
{
nw[i]=q[head][i];
// cout<<i<<" "<<nw[i]<<endl;
}
// cout<<"-----------------------"<<endl;
if(nw[0]==d[0]&&nw[1]==d[1]&&nw[2]==d[2])
{
cout<<q[head][3]<<endl;
break;
}
for(int i=0; i<=g[nw[0]].size(); i++)
for(int j=0; j<=g[nw[1]].size(); j++)
for(int k=0; k<=g[nw[2]].size(); k++)
{
nt[0]=(i==g[nw[0]].size()?nw[0]:g[nw[0]][i]);
nt[1]=(j==g[nw[1]].size()?nw[1]:g[nw[1]][j]);
nt[2]=(k==g[nw[2]].size()?nw[2]:g[nw[2]][k]);
if((nt[0]&&nt[1]&&(nt[0]==nt[1]))||(nt[0]&&nt[2]&&(nt[0]==nt[2]))||(nt[1]&&nt[2]&&(nt[1]==nt[2]))) continue;
if(((nt[0]&&nt[1]&&(nt[0]==nw[1])&&(nt[1]==nw[0]))||(nt[0]&&nt[2]&&(nt[0]==nw[2])&&(nt[2]==nw[0]))||(nt[1]&&nt[2]&&(nt[1]==nw[2])&&(nt[2]==nw[1])))) continue;
if(!v[nt[0]][nt[1]][nt[2]])
{
tail++;
q[tail][3]=q[head][3]+1;
v[nt[0]][nt[1]][nt[2]]=1;
for(int l=0; l<3; l++) q[tail][l]=nt[l];
}
}
//cout<<"---------------------------"<<endl;
}
}
int ID(int i,int j)
{
return i*m+j+1;
}
void Find()
{
int num=-1;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(st[i][j]>='a'&&st[i][j]<='z')
{
num++;
q[1][num]=ID(i,j);
for(int k=0; k<n; k++)
{
int flag=0;
for(int l=0; l<m; l++)
if((char)(int)(st[k][l]+32)==st[i][j])
{
d[num]=ID(k,l);
flag=1;
break;
}
if(flag) break;
}
}
}
}
void make()
{
getline(cin,st[0]);
for(int i=0; i<n; i++)
{
getline(cin,st[i]);
// cout<<st[i]<<endl;
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(st[i][j]!='#')
{
for(int k=0; k<4; k++)
{
int x=i+dx[k];
int y=j+dy[k];
if(x<n&&x>=0&&y<m&&y>=0&&st[x][y]!='#')
{
g[ID(i,j)].push_back(ID(x,y));
// cout<<ID(i,j)<<" "<<ID(x,y)<<endl;
}
}
}
}
int main()
{
#ifdef debug
freopen("in.in","r",stdin);
#endif // debug
while((cin>>m>>n>>k)&&n)
{
init();
make();
Find();
solve();
}
return 0;
}
UVA 1601(p205)----The Moring after Halloween
最新推荐文章于 2024-01-29 18:43:34 发布