胜利大逃亡(续)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10925    Accepted Submission(s): 3977

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

题目分析:

题目大意是问能否在有限的时间走出迷宫,在走的过程中,会遇到门,若有对应门的钥匙则可以通过,否则不能。

迷宫问题很容易想到BFS。表示人的状态除了有位置信息x,y和时间信息t,还有钥匙的信息。钥匙最多有10把,每把钥匙有取和不取两种状态,共有2^10种可能的情况,太大了,所以想到状态压缩,用二进制位的0,1来代表取和不取。

代码:

#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
/*
Node:   x,y:位置,step:时间,key:钥匙的状态p: 四个方向
vis:    标记数组
*/
struct Node {int x;int y;int step;int key;Node(int a = 0, int b = 0, int c = 0, int d = 0) :x(a), y(b), step(c), key(d) {}
};
int n, m, t;
int sx, sy;
char maze[22][22];
queue<Node> q;
int vis[22][22][1025];
int p[4][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
/*
BFS
检测是否有该钥匙:   kk >> (maze[xx][yy] - 'A') & 1
获取钥匙:   kk | (1 << (maze[xx][yy] - 'a'))
*/
int bfs() {Node temp;while (!q.empty())q.pop();q.push(Node(sx, sy, 0, 0));while (!q.empty()){temp = q.front();q.pop();int xx, yy, ss, kk;for (int i = 0; i < 4; i++) {xx = temp.x + p[i][0];yy = temp.y + p[i][1];ss = temp.step + 1;kk = temp.key;if (xx < 0 || xx >= n || yy < 0 || yy >= m)continue;if (ss >= t)continue;if (vis[xx][yy][kk])continue;if (maze[xx][yy] == '*')continue;if (maze[xx][yy] == '^'){return ss;}if (maze[xx][yy] >= 'A' && maze[xx][yy] <= 'J'){if (!(kk >> (maze[xx][yy] - 'A') & 1)) {continue;}}if (maze[xx][yy] >= 'a'&&maze[xx][yy] <= 'j'){kk = kk | (1 << (maze[xx][yy] - 'a'));}vis[xx][yy][kk] = 1;q.push(Node(xx, yy, ss, kk));}}return -1;
}int main() {while (cin >> n >> m >> t) {memset(vis, 0, sizeof(vis));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> maze[i][j];if (maze[i][j] == '@') {sx = i;sy = j;}}}cout << bfs() << endl;}return 0;
}

(HDU1429)胜利大逃亡(续)-BFS-状态压缩相关推荐

  1. hdu 1429 胜利大逃亡(续) bfs+状态压缩

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

  2. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  3. HDU-1429 胜利大逃亡(续)

    A - 胜利大逃亡(续) Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  4. hdu1429 胜利大逃亡(续) (BFS+简单状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:逃离迷宫,但是迷宫里有钥匙和门 题目思路: 关于状态压缩: 1.判断一个数字x二进制下 ...

  5. HDU1429胜利大逃亡(续)HDU 1885 Key Task BFS+状态压缩+水

    HDU1429 只有10把钥匙 1<<10足够了 标记用三维数组 用Linux好不习惯 继续克服- #include <stdio.h> #include <string ...

  6. hdu1429 胜利大逃亡(续)

    让我初识位压缩的一道BFS题,之前采用结构中增加char类型的key[26],然后采用数组映射实现对钥匙的存储,交上去悲剧地MLE了,然后在YHL大牛的博客上发现了位压缩这一好东东,现在和大家分享一下 ...

  7. HDU - 1429 胜利大逃亡(续) (BFS+状压)

    题目链接 思路 因为新拿到一把钥匙所以相同位置可以重复走,一共10把钥匙二进制表示拿到的钥匙,判断下个位置是否可以走. #include <bits/stdc++.h> const int ...

  8. BFS——1429 胜利大逃亡(续)

    1429 胜利大逃亡(续) 文章目录 1429 胜利大逃亡(续) 题意: 思路: 本题的重点在于标记数组,除了基本的坐标 ( x , y ) (x,y) (x,y)以外,在同一位置是否有某个钥匙显然会 ...

  9. HDU 1429 胜利大逃亡(续)

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

最新文章

  1. MySQL数据库(五)使用pymysql对数据库进行增删改查
  2. 安卓java读取软件自身包名,android 获取第三方应用程序包名并启动 | 学步园
  3. 科普:浅谈 Hellinger Distance
  4. Vue入门一、常用的指令
  5. 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring
  6. springframework包下的RequestContextHolder类和ServletRequestAttributes类的源码和使用
  7. 【数据库】PLSQL Developer出现ORA-12541TNS no listener错误解决方法
  8. 腾讯运维技术专家集结,揭秘高效智能运维 | 沙龙报名中
  9. Strange List CodeForces - 1471B
  10. 单径Rayleigh信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)
  11. slack通知本地服务器_通过构建自己的Slack App学习无服务器
  12. 创建实现一个简单的web项目
  13. Servlet页面跳转实现方法的区别
  14. 微服务开发的入门级框架Spring Boot详解:注解
  15. 【手写数字识别】基于matlab GUI BP神经网络手写数字识别系统【含Matlab源码 1639期】
  16. 【2018宁夏邀请赛 L】Continuous Intervals【线段树】
  17. C Programming Style 总结
  18. Code-NFine:NFine权限控制
  19. SAP ABAP开发实战——从入门到精通系列教程目录
  20. 指纹识别算法c++实现

热门文章

  1. excel技巧_老Excel狗学新技巧
  2. 最详细在Windows安装Xamarin.iOS教程
  3. java的标识符由字母,Java语言规定标识符由字母、下划线、美元符号和数字组成,并且第一个字符不能是___________...
  4. 如何向百度站长用post方法主动推送链接
  5. Unity 角色自动播放随机动画
  6. 盛世昊通“2021年汽车经济新模式发展峰会即将隆重举行
  7. VsCode Vue 快捷键生成代码模板(Vue2、Vue3)
  8. 牛年宝宝起名取名字:古诗有文采典故的女孩名字
  9. mac屏幕和音频录制_如何解决音频破裂和其他Mac声音问题
  10. 神乎其技的腿法《终极悍将II》是不可能应用于实战的