搜索专题: 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 ...
随机推荐
- C#与JAVA的互通
C#与JAVA的互通 https://blog.csdn.net/sinat_35165183/article/details/68936910
- C/C++运算符优先级关系
C/C++优先级 从高到低 1~14梯队 1. () [] . -> 2. ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) ...
- vue - 登录验证与权限控制
描述具体问题 需求 业务系统通常需要登录才能访问受限资源,在用户未登录情况下访问受限资源需要重定向到登录页面: 多个业务系统之间要实现单点登录,即在一个系统或应用已登录的情况下,再访问另一个系统时不需 ...
- React native 之 async/await
参考资料 :https://www.jianshu.com/p/1e75bd387aa0 要点: 1. async function(){} 将普通函数转换成Promise 2. await 表达式/ ...
- SQL高级教程-TOP 子句
TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. SQL Server 的语法: S ...
- BZOJ 4488: [Jsoi2015]最大公约数 暴力 + gcd
Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列 {Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L, ...
- QGIS源码解析和二次开发
使用Python 开发一个交通系统? 不如基于GeoServer来开发更能产生效益 QGIS3d:https://blog.csdn.net/shi_weihappy/article/details/ ...
- 2019.9.23JAVA课堂测试
1.题目 使用递归方式判断某个字串是否是回文( palindrome ) “回文”是指正着读.反着读都一样的句子.比如“我是谁是我”使用递归算法检测回文的算法描述如下:A single or zero ...
- Windows和Linux下搭建J2sdk的环境
J2SDK 作为jsp系统配置中必不可少的组件,越来越多的得到应用.下来是我整理的以往工作时搜集的资料.使用时方便查询,希望对广大的工程师有帮助. windows服务器环境下 j2sdk 的安装和环境 ...
- 一个强大的json解析工具类
该工具类利用递归原理,能够将任意结构的json字符串进行解析.当然,如果需要解析为对应的实体对象时,就不能用了 package com.wot.cloudsensing.carrotfarm.util ...