搜索专题: HDU1429胜利大逃亡
胜利大逃亡(续)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9076 Accepted Submission(s): 3275
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
4 5 17
@A.B.
a*.*.
*..*^
c..b* 4 5 16
@A.B.
a*.*.
*..*^
c..b*
16
-1
RunId : 21338472 Language : C++ Author : hnustwanghe
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 20 + 5;
typedef struct node{
int x,y,step,key;
bool operator < (const node x)const {
return step > x.step;
}
}Node;
char mat[N][N];
bool visit[N][N][1030];
Node start;
int n,m,k;
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int BFS(){
priority_queue<Node> Q;
memset(visit,0,sizeof(visit));
Node s;
visit[start.x][start.y][start.key] = true;
Q.push(start);
while(!Q.empty()){
Node t = Q.top();Q.pop();
if(mat[t.x][t.y]=='^' && t.step < k) return t.step;
for(int d=0;d<4;d++){
s = t;
s.x = s.x + dir[d][0];
s.y = s.y + dir[d][1];
if(s.x >= 0 && s.x < n && s.y >= 0 && s.y < m && mat[s.x][s.y]!='*'&& !visit[s.x][s.y][s.key]){
if(mat[s.x][s.y]>='A'&&mat[s.x][s.y]<='J'){
int key = 1<<(mat[s.x][s.y]-'A');
if(s.key & key){
s.step+=1;
visit[s.x][s.y][s.key] = true;
if(s.step < k)
Q.push(s);
}
}else if(mat[s.x][s.y]>='a' && mat[s.x][s.y]<='j'){
int key = 1<<(mat[s.x][s.y]-'a');
s.key=s.key|key;
s.step+=1;
visit[s.x][s.y][s.key] = true;
if(s.step < k)
Q.push(s);
}else {
s.step+=1;
visit[s.x][s.y][s.key] = true;
if(s.step < k)
Q.push(s);
}
}
}
}
return -1;
}
void Input_data(){
for(int i=0;i<n;i++){
scanf("%s",mat[i]);
for(int j=0;j<m;j++)
if(mat[i][j] == '@')
start.x =i,start.y = j,start.step =start.key = 0;
}
}
int main(){
while(scanf("%d %d %d",&n,&m,&k)==3){
Input_data();
printf("%d\n",BFS());
}
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 20 + 5;
typedef struct node{
int x,y,step,key;
bool operator < (const node x)const {
return step > x.step;
}
}Node;
char mat[N][N];
bool visit[N][N][1030];
Node start;
int n,m,k;
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int BFS(){
priority_queue<Node> Q;
memset(visit,0,sizeof(visit));
Node s;
visit[start.x][start.y][start.key] = true;
Q.push(start);
while(!Q.empty()){
Node t = Q.top();Q.pop();
if(mat[t.x][t.y]=='^' && t.step < k) return t.step;
for(int d=0;d<4;d++){
s = t;
s.x = s.x + dir[d][0];
s.y = s.y + dir[d][1];
if(s.x >= 0 && s.x < n && s.y >= 0 && s.y < m && mat[s.x][s.y]!='*'&& !visit[s.x][s.y][s.key]){
if(mat[s.x][s.y]>='A'&&mat[s.x][s.y]<='J'){
int key = 1<<(mat[s.x][s.y]-'A');
if(s.key & key){
s.step+=1;
visit[s.x][s.y][s.key] = true;
if(s.step < k)
Q.push(s);
}
}else if(mat[s.x][s.y]>='a' && mat[s.x][s.y]<='j'){
int key = 1<<(mat[s.x][s.y]-'a');
s.key=s.key|key;
s.step+=1;
visit[s.x][s.y][s.key] = true;
if(s.step < k)
Q.push(s);
}else {
s.step+=1;
visit[s.x][s.y][s.key] = true;
if(s.step < k)
Q.push(s);
}
}
}
}
return -1;
}
void Input_data(){
for(int i=0;i<n;i++){
scanf("%s",mat[i]);
for(int j=0;j<m;j++)
if(mat[i][j] == '@')
start.x =i,start.y = j,start.step =start.key = 0;
} }
int main(){
while(scanf("%d %d %d",&n,&m,&k)==3){
Input_data();
printf("%d\n",BFS());
}
}
搜索专题: HDU1429胜利大逃亡的更多相关文章
- Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(0) 收藏
胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Subm ...
- hdu1429胜利大逃亡(bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】
题目链接:https://vjudge.net/contest/84620#problem/K 题目大意:一个人从起点走到终点,问他是否能够在规定的时间走到,在走向终点的路线上,可能会有一些障碍门,他 ...
- HDU1429 胜利大逃亡 状压bfs
http://acm.hdu.edu.cn/viewcode.php?rid=22225154 因为总共a-j有10种钥匙,所以可以把有没有钥匙的状态压到一个int数里,然后dfs. 昨天状态特别不好 ...
- HDU1429:胜利大逃亡(续)
传送门 题意 给出一个迷宫,门需要钥匙来打开,t秒内能否从起点到达终点 分析 这题我用以前一道题的代码改了改就过了,具体思想:设置vis[status][x][y],status记录到达该点拥有的钥匙 ...
- hdu1429 胜利大逃亡(续)???天天逃亡???
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1429/ 题目就是迷宫问题的变种,给出一张地图,上面分布着钥匙和门,一种要是只能开一种特定的门,给出起点和终点,问 ...
- 胜利大逃亡(续)hdu1429(bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 题目1456:胜利大逃亡(广度优先搜索BFS)
题目链接:http://ac.jobdu.com/problem.php?pid=1456 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- hdoj 1253 胜利大逃亡
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
随机推荐
- 介绍HTML5几种存储方式
总体情况 h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大小是4k之内.主Domain污染. 主要应用:购物车.客户登录 对于IE浏览器有UserData,大小是64k ...
- 解决"'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件"的问题
大家好,我是Connor,今天我为大家带来解决CMD命令无法直接运行 '点子' 进行安装库的问题. 今天本来想安装库来着,但是苦于pycharm的设置里不知道出了什么原因,无奈只能使用PIP功能来安装 ...
- C#内存占用释放
序言 系统启动起来以后,内存占用越来越大,使用析构函数.GC.Collect什么的也不见效果,后来查了好久,找到了个办法,就是使用 SetProcessWorkingSetSize函数.这个函数是Wi ...
- OI多项式 简单学习笔记
咕咕咕 先开个坑(其实是存模板来了) 一些特别简单的前置东西qwq 复数的计算 复数相加:向量相加,复数相乘.复数相乘:模长相乘,旋转量相加(就是复平面坐标轴逆时针旋转的角度) (当然也可以直接使用c ...
- React 项目中修改 Ant Design 的默认样式(Input Checkbox 等等
修改样式更符合项目的需求特别是在 Input 和 Checkbox 等等一系列 试过很的方式都有问题, 比如直接在行内添加样式会无法传递到特定的层级 最好的办法是添加 id 可行 渲染部分代码 < ...
- 接口自动化request库入门
requests库7个主要方法 r= requsts.get(),主要属性: r.raise_for_status()方法内部判断r.status_code是否等于200不需要增加额外的if语句,该语 ...
- 深入浅说服务如何以Jar包的方式发布
序言 笔者前段时间在使用自研框架NF( 传送门 )开发一个自动模板生成工具之后,想将他发布到Linux下,之前一直使用IDE直接run as运行,在遇到发布的时候考虑过发布为war或者jar,在一番抉 ...
- Tomcat配置多域名 Alias
在Tomcat配置多域名,目的是和apache相对应,实现多域名访问. 使用 < Alias></ Alias>,务必注意,使用的是首字母大写. 我刚开配置使用小写,如果hos ...
- c++内置变量类型
1,各种变量占据的内存空间 char:1个字节,也可亦作为0-255的数值参与运算 一般来说,静态存储区的自动赋初值,动态则不自动(貌似也不对,因为非内置变脸的类型,也都调用了默认构造函数进行初始化) ...
- 《Effective Java》读书笔记 - 9.异常
Chapter 9 Exceptions Item 57: Use exceptions only for exceptional conditions 这条item的意思就是,千万不要用except ...