胜利大逃亡(续)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 9076    Accepted Submission(s): 3275

Problem Description
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……



这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
 
Input
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:



. 代表路

* 代表墙

@ 代表Ignatius的起始位置

^ 代表地牢的出口

A-J 代表带锁的门,对应的钥匙分别为a-j

a-j 代表钥匙,对应的门分别为A-J



每组测试数据之间有一个空行。
 
Output
针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
 
Sample Input
4 5 17
@A.B.
a*.*.
*..*^
c..b* 4 5 16
@A.B.
a*.*.
*..*^
c..b*
 
Sample Output
16
-1
 
Author
LL
Problem : 1429 ( 胜利大逃亡(续) )     Judge Status : Accepted

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胜利大逃亡的更多相关文章

  1. Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(0) 收藏

    胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Subm ...

  2. hdu1429胜利大逃亡(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】

    题目链接:https://vjudge.net/contest/84620#problem/K 题目大意:一个人从起点走到终点,问他是否能够在规定的时间走到,在走向终点的路线上,可能会有一些障碍门,他 ...

  4. HDU1429 胜利大逃亡 状压bfs

    http://acm.hdu.edu.cn/viewcode.php?rid=22225154 因为总共a-j有10种钥匙,所以可以把有没有钥匙的状态压到一个int数里,然后dfs. 昨天状态特别不好 ...

  5. HDU1429:胜利大逃亡(续)

    传送门 题意 给出一个迷宫,门需要钥匙来打开,t秒内能否从起点到达终点 分析 这题我用以前一道题的代码改了改就过了,具体思想:设置vis[status][x][y],status记录到达该点拥有的钥匙 ...

  6. hdu1429 胜利大逃亡(续)???天天逃亡???

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1429/ 题目就是迷宫问题的变种,给出一张地图,上面分布着钥匙和门,一种要是只能开一种特定的门,给出起点和终点,问 ...

  7. 胜利大逃亡(续)hdu1429(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. 题目1456:胜利大逃亡(广度优先搜索BFS)

    题目链接:http://ac.jobdu.com/problem.php?pid=1456 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  9. hdoj 1253 胜利大逃亡

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. C#与JAVA的互通

    C#与JAVA的互通 https://blog.csdn.net/sinat_35165183/article/details/68936910

  2. C/C++运算符优先级关系

    C/C++优先级 从高到低 1~14梯队 1.  ()  []  .  -> 2.   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)   ...

  3. vue - 登录验证与权限控制

    描述具体问题 需求 业务系统通常需要登录才能访问受限资源,在用户未登录情况下访问受限资源需要重定向到登录页面: 多个业务系统之间要实现单点登录,即在一个系统或应用已登录的情况下,再访问另一个系统时不需 ...

  4. React native 之 async/await

    参考资料 :https://www.jianshu.com/p/1e75bd387aa0 要点: 1. async function(){} 将普通函数转换成Promise 2. await 表达式/ ...

  5. SQL高级教程-TOP 子句

    TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. SQL Server 的语法: S ...

  6. BZOJ 4488: [Jsoi2015]最大公约数 暴力 + gcd

    Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列 {Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L, ...

  7. QGIS源码解析和二次开发

    使用Python 开发一个交通系统? 不如基于GeoServer来开发更能产生效益 QGIS3d:https://blog.csdn.net/shi_weihappy/article/details/ ...

  8. 2019.9.23JAVA课堂测试

    1.题目 使用递归方式判断某个字串是否是回文( palindrome ) “回文”是指正着读.反着读都一样的句子.比如“我是谁是我”使用递归算法检测回文的算法描述如下:A single or zero ...

  9. Windows和Linux下搭建J2sdk的环境

    J2SDK 作为jsp系统配置中必不可少的组件,越来越多的得到应用.下来是我整理的以往工作时搜集的资料.使用时方便查询,希望对广大的工程师有帮助. windows服务器环境下 j2sdk 的安装和环境 ...

  10. 一个强大的json解析工具类

    该工具类利用递归原理,能够将任意结构的json字符串进行解析.当然,如果需要解析为对应的实体对象时,就不能用了 package com.wot.cloudsensing.carrotfarm.util ...