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 ...
随机推荐
- Python 中文报错 SyntaxError: Non-ASCII character解决办法
只需要在最顶部的位置加上 #-*- coding:utf-8 -*- 就行了. 如果还是没有好,打开设置并搜索file encoding并作如图修改便好.
- (转)iOS Wow体验 - 第七章 - 操作图例与触屏人机工学
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第七章译文精选,其余章节将陆续放出.上一篇:Wow ...
- Java基础 -- 冒泡排序算法(带详细注释)
冒泡排序的要点: 1.多轮排序,每轮排序中选出最大的元素放在最顶端,并且下次排序不再使用该元素; 2. 使用双for循环,外层for循环控制要排序的次数(轮数), 内层for循环控制当前要排序的元素并 ...
- Javascript: 截取字符串多出来并用省略号[...]显示
/背景知识/ substring 方法用于提取字符串中介于两个指定下标之间的字符 substring(start,end) 开始和结束的位置,从零开始的索引 参数描述 start 必需.一个非负的整数 ...
- AssemblyInfo.cs文件的作用
在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些參数,以下是默认的AssemblyInfo.cs文件的内容详细介绍 //是否符合公共 ...
- Laravel 4 Blade模板引擎
http://my.oschina.net/5say/blog/201290 模板输出 基本输出 1 <!-- app/views/example.blade.php --> 2 < ...
- (转)vivoxshot 精英版三模转五模模式切换操作方法
https://yunpan.cn/cPUBWc8vtKpID (提取码:de92) 本帖最后由 韩爱峰 于 2016-3-29 23:00 编辑 碰到不少机友在使用过程中操作不成功,现将我的方法跟大 ...
- viewstate加密(转)
ViewState在客户端展开的时候,默认是Auto,不加密的,如果页面有限制性的表单控件才加密,所以,可以查看,代码如下: byte[] bytes = Convert.FromBase64Stri ...
- Android黑科技,读取用户短信+修改系统短信数据库
安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...
- .net安装windows服务配置文件config
.net安装windows服务 : 在windows服务的项目(WindowsService1)代码文件中有一个app.config 配置文件,可以通过此文件进行时间等的更改而无需重新生成项目:那我们 ...