BFS+状态压缩 HDU1429
胜利大逃亡(续)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3734 Accepted Submission(s): 1216
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
@A.B.
a*.*.
*..*^
c..b*
4 5 16
@A.B.
a*.*.
*..*^
c..b*
-1
HDU1429 题目链接:here
HDU1885 题目链接:here(与此题如出一辙)
BFS+状态压缩
用flag[x][y][key]标记已搜索过的状态,key的一个二进制位代表一种钥匙,如果获得了第 i 种钥匙,就将key的第 i 位置为1,如果访问有第 i 种锁的地方则要求key的第 i 位为1;
#include<cstdio>
#include<queue>
#define N 24 using namespace std; struct node
{
int x,y,key,dist;
}; char map[N][N],str[N];
int flag[N][N][1<<11],sx,sy,ans;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
queue<node> q; void bfs(void)
{
while(!q.empty()) q.pop();
node t,nt;
t.x=sx;
t.y=sy;
t.key=0;
t.dist=0;
q.push(t);
while(!q.empty()) {
t=q.front();
q.pop();
//printf("search:%d %d %d\n",t.x,t.y,t.key);
for(int i=0;i<4;i++) {
nt.dist=t.dist+1;
nt.key=t.key;
nt.x=t.x+dx[i];
nt.y=t.y+dy[i];
if(map[nt.x][nt.y]=='^' && ans>nt.dist) {
ans=nt.dist;
return ;
}
else if('a'<=map[nt.x][nt.y] && map[nt.x][nt.y]<='z') {
nt.key=t.key|(1<<(map[nt.x][nt.y]-'a'));
}
if(map[nt.x][nt.y]!='*' && flag[nt.x][nt.y][nt.key]==0 && nt.dist<ans) {
flag[nt.x][nt.y][nt.key]=1;
if('A'<=map[nt.x][nt.y] && map[nt.x][nt.y]<='Z') {
if((nt.key&(1<<(map[nt.x][nt.y]-'A')))) q.push(nt);
}
else q.push(nt);
}
}
}
} int main()
{
//freopen("1.in","r",stdin);
int n,m,t;
while(scanf("%d%d%d",&n,&m,&t)!=EOF) {
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
map[i][j]='*';
memset(flag[i][j],0,sizeof(flag[i][j]));
}
}
for(int i=1;i<=n;i++) {
scanf("%s",str);
for(int j=1;j<=m;j++) {
map[i][j]=str[j-1];
if('@'==map[i][j]) sx=i,sy=j,map[i][j]='.';
}
}
ans=t;
bfs();
if(ans<t) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}
BFS+状态压缩 HDU1429的更多相关文章
- HDU1429+bfs+状态压缩
bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- 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 ...
- hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)
题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...
- HDU 1885 Key Task (BFS + 状态压缩)
题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...
- hdu 1429(bfs+状态压缩)
题意:容易理解,但要注意的地方是:如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败.因为这里我贡献了一次wa. 分析:仔细阅读题目之后,会发现最多的钥匙数量为10把,所以把这个作为题目的突破口, ...
- UVALive 3956 Key Task (bfs+状态压缩)
Key Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/D Description The Czech Technica ...
随机推荐
- nginx 日志格式
log_format main '$http_host $server_addr $remote_addr [$time_local] "$request" ' '$request ...
- 如何把Python2的代码转换为Python3的代码
如何把Python2的代码转换为Python3的代码 注: 如果对于python2和python3不熟悉的,可以参考: [整理]总结Python2(Python 2.x版本)和Python3(Pyth ...
- RHEL 6.3使用CentOS yum源 (redhat yum安装失败)
由于Redhat的yum在线更新是收费的,如果没有注册的话是不能使用的,即不能在线安装软件.所以yum install 命令每次都安装失败 下面介绍一种更改yum源的方式: 系统说明: 系统:Red ...
- 依赖注入及AOP简述(九)——单例和无状态Scope .
三.依赖注入对象的Scope及其生命周期 在前面的章节我们讲到,依赖注入容器之所以能够区别于以往的ServiceLocator等容器,是在于其不但能够自动构建多层次的.完整的依赖关系图,并且可以管理依 ...
- 【部分枚举】【3-21个人赛】ProblemH
Problem H Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Sub ...
- JAVA 和 C# 调用外部.exe文件,传值并等等exe完成,获取返回值
JAVA- String ykexe = getProperty("ykexe") + " " + tableout; //getproperty(" ...
- SqlDataAdapter.Update()方法与SqlCommandBuilder(转)
用SqlDataAdapter操纵数据集时最常用到的就是Fill()与Update()方法.Fill()填充DataSet或DataTable,而Update()就是将DataSet或DataTabl ...
- maven将jar包安装到本地仓库的命令
进入cmd 执行以下命令: mvn install:install-file -Dfile=E:\sqljdbc4.jar -DgroupId=com.microsoft.sqlserver -Dar ...
- week 与 strong区别 精辟的解释
转:http://stackoverflow.com/questions/9262535/explanation-of-strong-and-weak-storage-in-ios5 觉得讲的很容易理 ...
- gulp配置版本号 教程之gulp-rev-append
简介: 使用gulp-rev-append给页面的引用添加版本号,清除页面引用缓存. 1.安装nodejs/全局安装gulp/项目安装gulp/创建package.json和gulpfile.js文件 ...