三维BFS 第三维进行一个状态的压缩就行,,,
注意不止一个出口,我们要寻找的是最小的那个,因为这个原因被卡了一天,,,
#include <bits/stdc++.h>
using namespace std;
#define CLR(a, b) memset(a,(b),sizeof(a))
const int INF = 0x3f3f3f3f;
const int MAXN = (int)2e2+10;
const int mod = (int)1e9+7;
const double eps = 1e-8;
int n, m, t, sx, sy;
bool flag;
bool vis[MAXN][MAXN][50];
char mps[MAXN][MAXN];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
char key[] = {'b', 'y', 'r', 'g'};
char door[] = {'B', 'Y', 'R', 'G'};
struct node {
int x, y, st, v;
node(int _x=0, int _y=0, int _st=0, int _v=0):x(_x),y(_y),st(_st),v(_v){}
bool operator <(const node &r)const {
return r.st < st;
}
};
bool check(int x, int y) {
return x>=0&&x<n&&y>=0&&y<m&&mps[x][y]!='#';
}
void bfs() {
priority_queue<node> que;
que.push(node(sx,sy,0,0));
vis[sx][sy][0] = true;
while(!que.empty()) {
node tmp = que.top();
que.pop();
for(int i = 0; i < 4; i++) {
int x = tmp.x+dx[i];
int y = tmp.y+dy[i];
if(check(x,y)) {
if(mps[x][y] == 'X') {
printf("Escape possible in %d steps.\n",tmp.st+1);
return ;
}
if(mps[x][y]>='a' && mps[x][y]<='z') {
int v;
for(int j = 0; j < 4; ++j) {
if(mps[x][y] == key[j]) {
v = tmp.v|(1<<j);
}
}
if(!vis[x][y][v]) {
vis[x][y][v] = true;
que.push(node(x,y,tmp.st+1,v));
}
}
else if(mps[x][y]>='A' && mps[x][y]<='Z') {
int v;
for(int j = 0; j < 4; ++j) {
if(mps[x][y] == door[j]) {
v = tmp.v&(1<<j);
}
}
if(!vis[x][y][tmp.v] && v) {
vis[x][y][tmp.v] = true;
que.push(node(x,y,tmp.st+1,tmp.v));
}
}
else {
if(!vis[x][y][tmp.v]) {
vis[x][y][tmp.v] = true;
que.push(node(x,y,tmp.st+1,tmp.v));
}
}
}
}
}
flag = false;
return ;
}
int main(int argc, char const *argv[]) {
while(~scanf("%d%d",&n,&m) && (n||m)) {
flag = true;
CLR(vis,false);
CLR(mps,0);
for(int i = 0; i < n; i++)
scanf("%s", mps[i]);
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(mps[i][j] == '*') {
sx = i; sy = j;
mps[i][j] = '.';
}
}
}
bfs();
if(!flag)
printf("The poor student is trapped!\n");
}
return 0;
}