#include
#include
#include
using namespace std;
bool vis[16][16][15][(1<<10)];
class ChessMaze {
public:
int traverseMaze(vector mat) {
memset(vis,0,sizeof vis);
int n,m;
n = mat.size();
m = mat[0].size();
int si,sj,ei,ej;
int b=0;
for(int i=0;iQ;
Q.push(si);
Q.push(sj);
Q.push(0);///K
Q.push(0);///kojK
Q.push(0);///kolku
vis[si][sj][0][0]=true;
int di[4]={1,-1,0,0};
int dj[4]={0,0,-1,1};
int dik[8]={-1,-1,1,1,2,2,-2,-2};
int djk[8]={-2,2,-2,2,-1,1,-1,1};
while(!Q.empty())
{
int ci=Q.front();
Q.pop();
int cj=Q.front();
Q.pop();
int k=Q.front();
Q.pop();
int kojk=Q.front();
Q.pop();
int kolku=Q.front();
Q.pop();
if(ci==ei && cj==ej)
{
return kolku;
}
///obicno pesacenje
for(int i=0;i<4;i++)
{
int ti=di[i]+ci;
int tj=dj[i]+cj;
if(ti>=0&&ti=0&&tj=n||ti<0||tj>=m||tj<0||mat[ti][tj]=='*')
{
continue;
}
if(mat[ti][tj] == 'E') {
return kolku + 1;
}
if(mat[ti][tj]=='.')
{
if(!vis[ti][tj][k-1][kojk])
{
Q.push(ti);
Q.push(tj);
Q.push(k-1);
Q.push(kojk);
Q.push(kolku+1);
vis[ti][tj][k-1][kojk]=true;
}
}
if(isdigit(mat[ti][tj]))
{
bool ok=kojk&(1<<(mat[ti][tj]-'0'));
if(!ok)
{
int nkojk=kojk|(1<<(mat[ti][tj]-'0'));
if(!vis[ti][tj][k][nkojk])
{
Q.push(ti);
Q.push(tj);
Q.push(k);
Q.push(nkojk);
Q.push(kolku+1);
vis[ti][tj][k][nkojk]=true;
}
}
else if(ok)
{
if(!vis[ti][tj][k-1][kojk])
{
Q.push(ti);
Q.push(tj);
Q.push(k-1);
Q.push(kojk);
Q.push(kolku+1);
vis[ti][tj][k-1][kojk]=true;
}
}
}
}
}
return -1;
}
};
/*
4 5
...*.
..***
...K*
S*E**
**/