UVALive 3956 Key Task (bfs+状态压缩)
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+状态压缩)的更多相关文章
- HDU 1885 Key Task (BFS + 状态压缩)
题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- HDU1429+bfs+状态压缩
bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...
- BFS+状态压缩 HDU1429
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 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 ...
- HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)
题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...
- UVALive 2520 Holedox Moving(BFS+状态压缩)
这个题目在比赛的时候我们是没有做出来的,但是听到他们说进制哈希的时候,感觉真的是挺高端的,于是赛后开始补题,本着我的习惯在看题解之前自己再试着写一遍,我当时存储状态的方法是string + map,我 ...
随机推荐
- Oracle数据库之四
删除记录的SQL语句 delete from 表名[where 条件];(DML) 注意: 如果没有where子句,代表全部删除(慎用). delete也必须commit后才能生效 truncate也 ...
- core—线程与IO
CPU执行线程期间,从内存里调用指令,然后运行,这些指令有可能要从硬盘里面,网络里,读取数据.我们知道在计算机硬件体系中,从内存读取数据的速度会大于从硬盘或网络里面的速度.线程必须要等到硬盘里面的数据 ...
- Kafka中的Message Delivary机制
学习Kafka的读书笔记,暂未把文章设为翻译类型,因为并非直译文档.水平有限,还请路过高手指正. <1> “最多(发送)一次”(At most once):消息可以丢失但绝不会重新发送:& ...
- [转载]initwithcoder和 initwithframe
大前提是UIViewController有一个UIView.同时,需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Buil ...
- web项目路径问题
路径 相对路径 URL中第一个字符不为“/” request.getRequestDispatcher("b"); 相对于该代码所在 ...
- UVA 11383 Golden Tiger Claw 金虎爪(KM算法)
题意: 给一个n*n的矩阵,每个格子中有正整数w[i][j],试为每行和每列分别确定一个数字row[i]和col[i],使得任意格子w[i][j]<=row[i]+col[j]恒成立.先输row ...
- erl_0012 timer:tc 测试模块函数调用运行耗时
timer:tc 可以测试出函数调用耗时,是erlang性能测试的好工具. timer:tc(?MODULE, Fun, [Args]).
- 实测 windows下nginx很不稳定,换成squid好多了
在windows server 2003 下尝试了号称支持50,000个并发连接数响应的nginx,结果相当不理想. 具体表现为时不时网页就卡住不动了,需要再刷新一次网页才能显示,而服务器cpu和内存 ...
- bjfu1281
思路挺简单的,但因为需要处理大数,所以就比较耗代码了. /* * Author : ben */ #include <cstdio> #include <cstdlib> #i ...
- PHP.ini 配置文件解析
[PHP] ;;;;;;;;;;;;;;;;;;;; About php.ini ;;;;;;;;;;;;;;;;;;;;; PHP's initialization file, generall ...