// hdu 1885 状压搜索入门
//
// 题目意思很简单,四种钥匙四种门,在状态里面
// 加入钥匙的二进制压缩,输出答案,就好了...
// 记一下板子
#include <cstdio>
#include <cmath>
#include <map>
#include <queue>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAX_N = 109;
const int MOD = 1e9 + 7;
const double PI = acos(-1);
int n,m;
bool vis[MAX_N][MAX_N][20];
const int dx[4] = {
-1,0,1,0
};
const int dy[4] = {
0,1,0,-1
};
char g[MAX_N][MAX_N];
struct Point{
int x;
int y;
int key;
int ans;
Point(){
}
Point(int x,int y,int key,int ans):x(x),y(y),key(key),ans(ans){
}
};
void print(){
printf("The poor student is trapped!\n");
}
int sx,sy;
bool in(int x,int y){
if (x >= 1 && x <= n && y >=1 && y <= m)
return true;
return false;
}
int idx(char c){
switch(c){
case 'B':
case 'b':
return 0;
case 'Y':
case 'y':
return 1;
case 'R':
case 'r':
return 2;
case 'G':
case 'g':
return 3;
}
}
void bfs(){
queue<Point> que;
Point u;
u.x = sx;
u.y = sy;
u.key = 0;
u.ans = 0;
que.push(u);
vis[sx][sy][0] = 1;
int st = 0;
int k = 0;
while(!que.empty()){
u = que.front();
que.pop();
for (int i = 0 ;i < 4;i ++){
int tx = u.x + dx[i];
int ty = u.y + dy[i];
if (!in(tx,ty))
continue;
if (g[tx][ty] == '#')
continue;
if(g[tx][ty] == 'X'){
printf("Escape possible in %d steps.\n",u.ans+1);
return ;
}
st = u.key;
k = idx(g[tx][ty]);
if(g[tx][ty] >= 'A' && g[tx][ty] <= 'Z'){
if (st & (1 << k) && !vis[tx][ty][st]){
vis[tx][ty][st] = 1;
que.push(Point(tx,ty,st,u.ans + 1));
}
}
else if (g[tx][ty] >= 'a' && g[tx][ty] <= 'z'){
st |= (1 << k);
if (vis[tx][ty][st])
continue;
vis[tx][ty][st] = 1;
que.push(Point(tx,ty,st,u.ans + 1));
}else {
if (!vis[tx][ty][st]){
vis[tx][ty][st] = 1;
que.push(Point(tx,ty,st,u.ans+1));
}
}
}
}
print();
}
void input(){
for (int i = 1;i <= n;i ++)
scanf("%s",g[i] + 1);
memset(vis,0,sizeof(vis));
for (int i = 1;i <= n;i ++){
for (int j = 1;j <= m;j ++){
if (g[i][j] == '*'){
sx = i;
sy = j;
break;
}
}
}
//print();
bfs();
}
int main(){
//freopen("te.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF && n && m){
input();
}
return 0;
}
hdu1885 状压搜索 板子
最新推荐文章于 2020-06-12 18:00:12 发布