Key Task

题目链接:

http://acm.hust.edu.cn/vjudge/contest/129733#problem/D

Description


The Czech Technical University is rather old -- you already know that it celebrates 300 years of its existence in 2007. Some of the university buildings are old as well. And the navigation in old buildings can sometimes be a little bit tricky, because of strange long corridors that fork and join at absolutely unexpected places.
The result is that some first-graders have often diffculties finding the right way to their classes. Therefore, the Student Union has developed a computer game to help the students to practice their orientation skills. The goal of the game is to find the way out of a labyrinth. Your task is to write a verification software that solves this game.
The labyrinth is a 2-dimensional grid of squares, each square is either free or filled with a wall. Some of the free squares may contain doors or keys. There are four different types of keys and doors: blue, yellow, red, and green. Each key can open only doors of the same color.
You can move between adjacent free squares vertically or horizontally, diagonal movement is not allowed. You may not go across walls and you cannot leave the labyrinth area. If a square contains a door, you may go there only if you have stepped on a square with an appropriate key before.

Input


The input consists of several maps. Each map begins with a line containing two integer numbers R and C (1

Output


For each map, print one line containing the sentence "Escape possible in S steps.", where S is the smallest possible number of step to reach any of the exits. If no exit can be reached, output the string "The poor student is trapped!" instead. One step is defined as a movement between two adjacent cells. Grabbing a key or unlocking a door does not count as a step.

Sample Input


```
1 10
*........X

1 3

*#X

3 20

####################

XY.gBr.*.Rb.G.GG.y#

####################

0 0

</big>

##Sample Output
<big>

Escape possible in 9 steps.

The poor student is trapped!

Escape possible in 45 steps.

</big>

##Source
<big>
2016-HUST-线下组队赛-2
</big> <br/>
##题意:
<big>
在n*m的地图上有一个起点和若干终点,有4种颜色的门及其对应钥匙,求最少的时间从起点到达任一终点.
</big> <br/>
##题解:
<big>
类似魔塔的搜索题,这里用bfs来搜最小步数即可. 用状态压缩处理每个位置拿到的钥匙状态.
判重:除了点坐标外,需要额外记录达到当前点的钥匙状态. (因为有些位置可能重复到达).
</big> <br/>
##代码:
``` cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <list>
#define LL long long
#define eps 1e-8
#define maxn 110
#define mod 100000007
#define inf 0x3f3f3f3f
#define mid(a,b) ((a+b)>>1)
#define IN freopen("in.txt","r",stdin);
using namespace std; int n, m;
char mp[maxn][maxn];
bool vis[maxn][maxn][1<<4]; bool is_ok(int x, int y) {
return x>=0 && y>=0 && x<n && y<m;
} struct node {
int x,y;
int step, key;
};
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; int bfs(int sx, int sy) {
queue<node> q;
while(!q.empty()) q.pop();
node cur, next;
cur.x = sx, cur.y = sy, cur.step = 0, cur.key = 0;
q.push(cur);
vis[sx][sy][0] = 1; while(!q.empty()) {
cur = q.front(); q.pop();
for(int i=0; i<4; i++) {
int xx = cur.x + dir[i][0];
int yy = cur.y + dir[i][1];
if(!is_ok(xx,yy) || mp[xx][yy]=='#') continue;
next.x = xx, next.y = yy, next.step = cur.step + 1; next.key = cur.key; if(mp[xx][yy] == 'X') return next.step; if(mp[xx][yy]>='a' && mp[xx][yy]<='z') {
if(mp[xx][yy] == 'b') next.key |= (1<<0);
if(mp[xx][yy] == 'y') next.key |= (1<<1);
if(mp[xx][yy] == 'r') next.key |= (1<<2);
if(mp[xx][yy] == 'g') next.key |= (1<<3);
} if(mp[xx][yy]>='A' && mp[xx][yy]<='Z') {
if( (mp[xx][yy] == 'B' && !(next.key&(1<<0))) ||
(mp[xx][yy] == 'Y' && !(next.key&(1<<1))) ||
(mp[xx][yy] == 'R' && !(next.key&(1<<2))) ||
(mp[xx][yy] == 'G' && !(next.key&(1<<3))) )
continue;
} if(vis[next.x][next.y][next.key]) continue;
vis[next.x][next.y][next.key] = 1;
q.push(next);
}
} return -1;
} int main(int argc, char const *argv[])
{
//IN; while(scanf("%d %d", &n,&m) != EOF && (n||m))
{
for(int i=0; i<n; i++)
scanf("%s", mp[i]); int sx = -1, sy = -1;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) if(mp[i][j] == '*') {
sx = i, sy = j; break;
}
if(sx != -1) break;
} memset(vis, 0, sizeof(vis));
int ans = bfs(sx, sy); if(ans == -1) printf("The poor student is trapped!\n");
else printf("Escape possible in %d steps.\n", ans);
} return 0;
}

UVALive 3956 Key Task (bfs+状态压缩)的更多相关文章

  1. HDU 1885 Key Task (BFS + 状态压缩)

    题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...

  2. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  3. hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

  4. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

    求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

  5. HDU1429+bfs+状态压缩

    bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...

  6. BFS+状态压缩 HDU1429

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)

    Description Flip game squares. One side of each piece is white and the other one is black and each p ...

  8. HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

    题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...

  9. UVALive 2520 Holedox Moving(BFS+状态压缩)

    这个题目在比赛的时候我们是没有做出来的,但是听到他们说进制哈希的时候,感觉真的是挺高端的,于是赛后开始补题,本着我的习惯在看题解之前自己再试着写一遍,我当时存储状态的方法是string + map,我 ...

随机推荐

  1. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  2. C++实现日期类(Date类)

    #include<iostream>using namespace std;class Date{public:    Date(int year = 1900, int month = ...

  3. 旧书重温:0day2【3】 详细解读PEB法 查找kener32地址

    题外话:上一篇文章中的 PEB法查找kerner32地址的方法 对TEB.PEB .PE结构 知识要求很高,确实在写汇编代码时候小编 感觉自己能力,信手啪啪一顿乱撸,结果一运行,非法访问了,没办法翻阅 ...

  4. (转)gLFlush()和gLFinish()

    笔者初使用OpenGL之时,所遇到的命令不能生效的问题:比如开始想用gLClearColor来设置背景色为红色,结果执行后背景还是默认的黑色.后来查阅资料,才知道这与OpenGL的指令执行流程有关,要 ...

  5. 基于HTTP的直播点播HLS

             HLS(HTTP Live Streaming) 是Apple在2009年发布的,可以通过普通的web服务器进行分发的新型流媒体协议.苹果官方对于视频直播服务提出了 HLS 解决方案 ...

  6. 使用Rxjava缓存请求

    最近,我尝试使用RxJava开发了一款闲时备份app.我必须承认,一旦你get到了正确的方式,RxJava几乎感觉就像作弊.一切看起来更简洁,多个请求能够被组合,且非常容易控制.通过在UI线程观察和在 ...

  7. JS面向对象的学习

    1.面向对象 var arr = new Array(); //[] //我们把系统自带的对象,叫做系统对象 var arr = []; arr.number = ; //对象下面的变量:叫做对象的属 ...

  8. java web项目导入问题

    由于工作问题,接触到很多其他人的项目,有时候想要直接跑起来,还是需要一定的耐力. 1:导入不进去,干脆新建项目,一个个复制进去: 2:第三方jar包不要忘记,核实jdk    j2ee的版本,编译路径 ...

  9. Android之ContentProvider总结

    1.适用场景 1) ContentProvider为存储和读取数据提供了统一的接口 2) 使用ContentProvider,应用程序可以实现数据共享 3) android内置的许多数据都是使用Con ...

  10. python开发中常见的小坑

    (1)可变参数类型作为函数参数默认值,函数参数默认值的设置在Python中只会被执行一次,也就是定义该函数的时候. 解决办法,设置为None,然后判断 (2)Python中的变量名解析遵循所谓的LEG ...