简单的bfs+对于钥匙的状态压缩。
需要熟练位运算啊!!
#include"cstdio"
#include"cstring"
#include"cstdlib"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
char map[25][25];
int move[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
int used[25][25][1030],b[12];
int n,m,sss;
int sx,sy,ex,ey;
struct node
{
int x,y,t,ys;
};
int ok(int x,int y,int t,int ys)
{
if(x<0||x>=n) return 0;
if(y<0||y>=m) return 0;
if(map[x][y]=='*') return 0;
if(used[x][y][ys]==1) return 0;
if(t>=sss) return 0;
if(map[x][y]>='A'&&map[x][y]<='J')
{
int tep=b[map[x][y]-'A'];
if((ys&tep)==0) return 0;
else return 1;
}
return 1;
}
int bfs()
{
node cur,next;
queue<node>q;
int i;
cur.x=sx;
cur.y=sy;
cur.t=0;
cur.ys=0;
used[cur.x][cur.y][cur.ys]=1;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
for(i=0; i<4; i++)
{
next.x=cur.x+move[i][0];
next.y=cur.y+move[i][1];
next.ys=cur.ys;
next.t=cur.t+1;
if(ok(next.x,next.y,next.t,next.ys))
{
if(next.x==ex&&next.y==ey)
return next.t;
used[next.x][next.y][next.ys]=1;
if(map[next.x][next.y]>='a'&&map[next.x][next.y]<='j')
{
int tep=b[map[next.x][next.y]-'a'];
if((next.ys&tep)==0)
next.ys+=tep;
}
q.push(next);
used[next.x][next.y][next.ys]=1;
}
}
}
return -1;
}
int main()
{
for(int i=0; i<11; i++) b[i]=1<<i;
while(scanf("%d%d%d",&n,&m,&sss)!=-1)
{
int i,j;
for(i=0; i<n; i++) scanf("%s",map[i]);
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(map[i][j]=='@')
{
sx=i;
sy=j;
}
if(map[i][j]=='^')
{
ex=i;
ey=j;
}
}
}
memset(used,0,sizeof(used));
printf("%d\n",bfs());
}
}