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. 为Gradle添加UTF-8支持

    gradle默认使用系统字符编码,大多数中文系统是使用GBK编码 但程序员绝大部分都是使用UTF-8写各类java文件以及其他资源文件 编译时很容易报错,比如下面的错误: ”警告:编码 GBK 的不可 ...

  2. Linux多线程(二)(线程等待,退出)

    1. 线程的等待退出 1.1. 等待线程退出 线程从入口点函数自然返回,或者主动调用pthread_exit()函数,都可以让线程正常终止 线程从入口点函数自然返回时,函数返回值可以被其它线程用pth ...

  3. 常见NoSQL的特点分析与比较

    3.分类: 3.1(最常见的键值存储) a.临时性的:保存在内存中,可以进行快速的保存和读取操作, 数据有可能丢失 b.永久性:在磁盘上保存数据,可以进行快读的读写(没有内存中快),数据不会丢失 c. ...

  4. [ionic开源项目教程] - 第11讲 封装BaseController实现controller继承

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 截止到第10讲,tab1[健康]模块的功能基本已经完成了,但这一讲中,controller层又做了较大的改动,因为下一讲中t ...

  5. Postgresql两表联结更新

    Postgresql两表联合更新近日使用Postgresql感到有点不好用,一个联合更新非要这样写语法才对:update d_routetripset name=b.name ,    descrip ...

  6. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  7. 【英语】Bingo口语笔记(17) - 表示“感谢/不用客气“

  8. Apache Conf/Vost/xx.conf 文件配置

    #监听8086端口Listen 8086 NameVirtualHost *:8086#保持绝对一致 <VirtualHost *:> ServerName localhost Serve ...

  9. linux各种查看端口号

    1.  查看端口占用情况的命令:lsof -i    [root@www ~]# lsof -i         COMMAND PID USER FD TYPE DEVICE SIZE NODE N ...

  10. 【转】Linux设备驱动之mmap设备操作

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/08/2281222.html 1.mmap系统调用 void *mmap(void *addr, ...