和之前那个hdu1429差不多
状态用位来标识,没啥区别,记得别习惯性标记走过的格子,是可以退回去的
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MAXN 110
struct Node{
int x,y,step;
int key;
};
char map[MAXN][MAXN];
bool visit[MAXN][MAXN][22];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m;
Node st;
char Door[4]={'B','Y','R','G'};
char Key[4]={'b','y','r','g'};
void bfs()
{
memset(visit,false,sizeof(visit));
queue<Node>Q;
Node p,q;
st.key=st.step=0;
visit[st.x][st.y][st.key]=true;
Q.push(st);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(map[p.x][p.y]=='X')
{
printf("Escape possible in %d steps.\n",p.step);
return ;
}
for(int i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
q.step=p.step+1;
q.key=p.key;
if(q.x<1||q.x>n||q.y<1||q.y>m||map[q.x][q.y]=='#')
continue;
if(isupper(map[q.x][q.y])&&map[q.x][q.y]!='X')
{
for(int j=0;j<4;j++)
{
if(map[q.x][q.y]==Door[j])
{
if(q.key&(1<<j))
{
if(!visit[q.x][q.y][q.key])
{
visit[q.x][q.y][q.key]=true;
Q.push(q);
}
break;
}
}
}
}
else if(islower(map[q.x][q.y]))
{
for(int j=0;j<4;j++){
if(map[q.x][q.y]==Key[j])
{
if((q.key&(1<<j))==0)
{
q.key+=(1<<j);
}
if(!visit[q.x][q.y][q.key])
{
visit[q.x][q.y][q.key]=true;
Q.push(q);
}
}
}
}
else
{
if(!visit[q.x][q.y][q.key])
{
visit[q.x][q.y][q.key]=true;
Q.push(q);
}
}
}
}
puts("The poor student is trapped!");
}
int main(){
while(scanf("%d%d",&n,&m),(n+m))
{
for(int i=1;i<=n;i++)
{
scanf("%s",map[i]+1);
for(int j=1;j<=m;j++)
{
if(map[i][j]=='*')
st.x=i,st.y=j;
}
}
bfs();
}
return 0;
}