http://acm.hdu.edu.cn/showproblem.php?pid=1429
//1329152 2009-05-02 08:34:49 Accepted 1429 687MS 4252K 2405 B C++ no way
#include<iostream>
#include<queue>
using namespace std;
struct Node


{
int x;
int y;
int step;
int num;
bool mark[10];
};

int dir[4][2]=
{-1,0,1,0,0,-1,0,1};

int binary[26]=
{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,
262144,524288,1048576,2097152,4194304,8388608,16777216,33554432};
char gra[21][21];
int flag[21][21][2049];
int m,n,t;
int sx,sy,ex,ey;

void bfs()


{
int i,k,temp,ch;
Node p,q;
queue<Node>Q;
p.x = sx;
p.y = sy;
p.step = 0;
p.num = 0;
for(i=0;i<10;i++)
p.mark[i] = false;
Q.push(p);
while(!Q.empty())

{
q = Q.front();
Q.pop();
if(q.x == ex && q.y == ey)

{
if(q.step < t)

{
cout<<q.step<<endl;
return ;
}
break ;
}
for(k=0;k<4;k++)

{
p = q;
p.x += dir[k][0];
p.y += dir[k][1];
if(p.x >=0 && p.x<m && p.y>=0 && p.y<n && gra[p.x][p.y] != '*')

{
if(gra[p.x][p.y] >= 'a' && gra[p.x][p.y] <= 'j')

{
ch = gra[p.x][p.y] - 'a';
if(p.mark[ch] == false)
temp = p.num + binary[ch];
else
temp = p.num;
if(flag[p.x][p.y][temp] == -1)

{
flag[p.x][p.y][temp] = q.step + 1;
p.step = q.step + 1;
p.num = temp;
p.mark[ch] = true;
Q.push(p);
}
}
else if(gra[p.x][p.y] >= 'A' && gra[p.x][p.y] <= 'J')

{
ch = gra[p.x][p.y] - 'A';
if(flag[p.x][p.y][p.num] == -1 && p.mark[ch] == true)

{
flag[p.x][p.y][p.num] = q.step + 1;
p.step = q.step + 1;
Q.push(p);
}
}
else

{
if(flag[p.x][p.y][p.num] == -1)

{
flag[p.x][p.y][p.num] = q.step + 1;
p.step = q.step + 1;
Q.push(p);
}
}
}
}//for(k=0;k<4;k++)
}//while(!Q.empty())
cout<<-1<<endl;
}

int main()


{
int i,j,k;
while(cin>>m>>n>>t)

{
for(i=0;i<m;i++)

{
scanf("%s",gra[i]);
for(j=0;j<n;j++)

{
if(gra[i][j] == '@')

{
sx = i;
sy = j;
}
else if(gra[i][j] == '^')

{
ex = i;
ey = j;
}
for(k=0;k<2049;k++)
flag[i][j][k] = -1;
}
}
bfs();
}
return 0;
}



































































































































































