hdu 1429 胜利大逃亡(续)(bfs+状态压缩)
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
每组测试数据的第一行有三个整数n,m,t(<=n,m<=,t>)。接下来的n行m列为地牢的地图,其中包括: . 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J 每组测试数据之间有一个空行。
针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-。
@A.B.
a*.*.
*..*^
c..b* @A.B.
a*.*.
*..*^
c..b*
-
第46行,if((t2.key&(1<<j))==0){//写成 t2.key&(1<<j)==0竟然一直错,&#%**&*!@#@#@!@!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 26
#define M (1<<10)+6
int n,m,t;
char mp[N][N];
struct Node{
int x,y;
int t;
int key;
}st,ed;
int dirx[]={,,-,};
int diry[]={-,,,};
char keys[]={'a','b','c','d','e','f','g','h','i','j'};
char door[]={'A','B','C','D','E','F','G','H','I','J'};
int vis[N][N][M];
void bfs(){
queue<Node>q;
q.push(st);
vis[st.x][st.y][st.key]=;
Node t1,t2;
while(!q.empty()){
t1=q.front();
//printf("*** %d%d %d\n",t1.x,t1.y,t1.key);
q.pop();
if(t1.x==ed.x && t1.y==ed.y && t1.t<t){
printf("%d\n",t1.t);
return;
}
for(int i=;i<;i++){
t2=t1;
t2.x=t1.x+dirx[i];
t2.y=t1.y+diry[i];
if(mp[t2.x][t2.y]=='*') continue;
if(t2.x< || t2.x>=n || t2.y< || t2.y>=m) continue;
if(vis[t2.x][t2.y][t2.key]) continue;
if(islower(mp[t2.x][t2.y])){
for(int j=;j<;j++){
if(mp[t2.x][t2.y]==keys[j]){ if((t2.key&(<<j))==){//写成 t2.key&(1<<j)==0竟然一直错,&#%**&*!@#@#@!@!
t2.key+=(<<j);
t2.t++;
vis[t2.x][t2.y][t2.key]=;
q.push(t2);
}
else{
//printf("+++%d\n",t2.key);
if(vis[t2.x][t2.y][t2.key]==){
t2.t++;
vis[t2.x][t2.y][t2.key]=;
q.push(t2);
}
}
}
}
}
else if(isupper(mp[t2.x][t2.y])){
for(int j=;j<;j++){
if(mp[t2.x][t2.y]==door[j]){
if(t2.key&(<<j)){
t2.t++;
vis[t2.x][t2.y][t2.key]=;
q.push(t2);
}
}
}
}
else{
t2.t++;
vis[t2.x][t2.y][t2.key]=;
q.push(t2);
} }
}
printf("-1\n");
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)==){
for(int i=;i<n;i++){
scanf("%s",mp[i]);
for(int j=;j<m;j++){
if(mp[i][j]=='@'){
st.x=i;
st.y=j;
st.t=;
st.key=;
}
if(mp[i][j]=='^'){
ed.x=i;
ed.y=j;
}
}
} memset(vis,,sizeof(vis));
bfs();
}
return ;
}
hdu 1429 胜利大逃亡(续)(bfs+状态压缩)的更多相关文章
- hdu - 1429 胜利大逃亡(续) (bfs状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=1429 终于开始能够做状态压缩的题了,虽然这只是状态压缩里面一道很简单的题. 状态压缩就是用二进制的思想来表示状态 ...
- hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
又开始刷题了 题意:略过. 分析:主要是确定状态量,除了坐标(x,y)之外,还有一个key状态,就好比手上拿着一串钥匙.状态可以用位运算来表示:key&(x,y)表示判断有没有这扇门的钥匙,k ...
- hdu 1429 胜利大逃亡(续)(bfs+位压缩)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...
- hdu.1429.胜利大逃亡(续)(bfs + 0101011110)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1429 胜利大逃亡(续)
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...
- HDU 1429 胜利大逃亡(续)(DP + 状态压缩)
胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...
- HDU 1429 胜利大逃亡(续)(bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
随机推荐
- hcharts
折线图 http://www.hcharts.cn/demo/index.php?p=10 饼状图 http://higrid.net/docs/highcharts_cn/#plotOptions- ...
- 深度剖析JDK动态代理机制
摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...
- AngularJs学习笔记3——自定义指令
指令 概述: 前面也说过一些常用指令,用于快速入门.现在详细总结一下:指令用于实现各种页面的操作,是对于底层DOM操作的封装,扩展了HTML的行为,实现页面交互以及数据绑定. 指令是一种执行的信号,一 ...
- ThinkPHP3.2.3中三大自动中的缺陷问题
我们在使用Thinkphp3.2.3框架时在对数据表进行模型化后就可以使用自动完成功能. 自动完成可以帮助我们更简便的完成对表单内容对数据表(集合)的填充,自动完成是基于: 当实例化数据库user后, ...
- JMeter脚本参数化和断言设置( CSV Data Set Config )
用Badboy录制了Jmeter的脚本,用Jmeter打开后形成了原始的脚本.但是在实际应用中,为了增强脚本的多样性,就要使脚本参数化.这里我以登录为例,参数化用户账号与用户密码. 图1 :原始脚本 ...
- HDU 3265 Posters(线段树)
HDU 3265 Posters pid=3265" target="_blank" style="">题目链接 题意:给定一些矩形海报.中间有 ...
- 静态方法中不能new内部类的实体对象
原因如下: 1.内部类可以访问外部类的成员变量 2.对象创建完成后对象的成员变量才会被分配空间 3.main的静态方法执行时可以不存在外部类,不创建实体对象 4.内部类能访问成员变量意味着一定存在外部 ...
- js数字精度丢失
http://www.cnblogs.com/snandy/p/4943138.html
- (转)javascript深入理解js闭包
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- BULK INSERT如何将大量数据高效地导入SQL Server
转载自:http://database.51cto.com/art/201108/282631.htm BULK INSERT如何将大量数据高效地导入SQL Server 本文我们详细介绍了BULK ...