Hdu 1429 胜利大逃亡(续) 分类: Brush Mode 2014-08-07 17:01 92人阅读 评论(0) 收藏
胜利大逃亡(续)
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 22 Accepted Submission(s) : 10
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
Input
. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
Output
Sample Input
- 4 5 17
- @A.B.
- a*.*.
- *..*^
- c..b*
- 4 5 16
- @A.B.
- a*.*.
- *..*^
- c..b*
Sample Output
- 16
- -1
做完这题,我感觉自己不得不写一篇解题报告来解释了;
这题最大的精华就是它用了三维数组;
分析题目,就是当你拿到钥匙后,你该如果去寻找门,
因为,当你走到拿钥匙的地方的时候,可以门已经被你标记为走完了,
所以,大神们用了三维数组来解决,
当你拿到钥匙后,就进入另一个从未被标记过的二维空间,
再次进行广搜,就是,当你拿到钥匙,你就进入一个空间,当你打开一扇门,你就掉出一个空间,
这就是这道题目的精华所在,I think
- #include<iostream>
- #include<queue>
- #include<cstring>
- using namespace std;
- struct node
- {
- int x, y, t, key;
- };
- int n, m, t;
- int sx, sy;
- char g[25][25];
- bool vis[25][25][1<<10];
- int dx[4]={0,1,0,-1};
- int dy[4]={1,0,-1,0};
- bool flag;
- void myscanf()
- {
- for(int i=0;i<n;i++)
- {
- scanf("%s",g[i]);
- for(int j=0;j<m;j++)
- {
- if(g[i][j]=='@')
- {
- sx = i;
- sy = j;
- g[i][j]='.';
- }
- }
- }
- }
- void bfs()
- {
- queue<node>q;
- node cur, v;
- cur.x = sx;
- cur.y = sy;
- cur.t = 0;
- cur.key = 0;
- vis[cur.x][cur.y][cur.key] = true;
- q.push(cur);
- while(!q.empty())
- {
- v = q.front();
- q.pop();
- if(v.t<t && g[v.x][v.y]=='^')
- {
- printf("%d\n",v.t);
- flag = true;
- return;
- }
- for(int i=0;i<4;i++)
- {
- cur.x = v.x + dx[i];
- cur.y = v.y + dy[i];
- cur.t = v.t + 1;
- cur.key = v.key;
- if(g[cur.x][cur.y]>='a'&&g[cur.x][cur.y]<='z')
- cur.key=v.key|(1<<(g[cur.x][cur.y]-'a'));
- if(g[cur.x][cur.y]=='*'||cur.t>=t) continue;
- else if(cur.x<0||cur.x>=n||cur.y<0||cur.y>=m||vis[cur.x][cur.y][cur.key]) continue;
- else
- {
- vis[cur.x][cur.y][cur.key] = true;
- if(g[cur.x][cur.y]>='A' && g[cur.x][cur.y]<='Z')
- {
- if(cur.key&(1<<(g[cur.x][cur.y]-'A')))
- {
- q.push(cur);
- }
- }
- else q.push(cur);
- }
- }
- }
- }
- int main()
- {
- while(scanf("%d%d%d",&n,&m,&t)!=EOF)
- {
- flag = false;
- memset(vis,false,sizeof(vis));
- memset(g,0,sizeof(g));
- myscanf();
- bfs();
- if(!flag) printf("-1\n");
- }
- return 0;
- }
版权声明:本文为博主原创文章,未经博主允许不得转载。
Hdu 1429 胜利大逃亡(续) 分类: Brush Mode 2014-08-07 17:01 92人阅读 评论(0) 收藏的更多相关文章
- Shuffle'm Up 分类: 函数 POJ 查找 2015-08-09 17:01 6人阅读 评论(0) 收藏
Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7529 Accepted: 3466 Descript ...
- OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏
//OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...
- 转自知乎,亲民好酒推荐 分类: fool_tree的笔记本 2014-11-08 17:37 652人阅读 评论(0) 收藏
这里尽量为大家推荐一些符合大众喜好.业内公认好评."即使你不喜欢,你也会承认它不错"的酒款.而且介绍到的酒款还会有一个共同的特征,就是能让你方便的在网上买到. 大概会分为烈酒,利口 ...
- Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
- MS SQL 合并结果集并求和 分类: SQL Server 数据库 2015-02-13 10:59 92人阅读 评论(0) 收藏
业务情景:有这样一张表:其中Id列为表主键,Name为用户名,State为记录的状态值,Note为状态的说明,方便阅读. 需求描述:需要查询出这样的结果:某个人某种状态的记录数,如:张三,待审核记录数 ...
- refresh的停车场 分类: 栈和队列 2015-06-18 17:13 26人阅读 评论(0) 收藏
refresh的停车场 TimeLimit: 1000ms Memory limit: 65536K 题目描述 refresh最近发了一笔横财,开了一家停车场.由于土地有限,停车场内停车数量有限,但是 ...
- 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏
一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...
- 写在新建博客的第一天 分类: fool_tree的笔记本 2014-11-08 17:57 144人阅读 评论(0) 收藏
来CSDN开博客的目的有两个: 其一是因为CSDN的代码输出,看过一些博文,觉得这里的代码输出真的很漂亮: 其二则是因为,感觉自己印象笔记用久了之后,渐渐地几乎不再自己写些东西了,习惯了方便的剪藏插件 ...
- UI基础:UIView(window,frame,UIColor,CGPoint,alpha,CGRect等) 分类: iOS学习-UI 2015-06-30 20:01 119人阅读 评论(0) 收藏
UIView 视图类,视图都是UIView或者UIView子类 UIWindow 窗口类,用于展示视图,视图一定要添加window才能显示 注意:一般来说,一个应用只有一个window 创建一个UIW ...
随机推荐
- 学习c语言的第9天
#include <stdio.h> int main() { float sum=0,wage=0; int i=1; int num; printf("+++平均工资统计程序 ...
- linux启动后自动登录并运行自定义图形界面程序
在<Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法>一文中提到linux启动在以后运行一个独占显示器的图形程序的两种办法. 1.不启动xserver,使 ...
- jquery.validate新的写法(jquery.validate1.13.js)
<script src="../js/jquery.js"></script> <script src="../js/jquery.vali ...
- 3.html5的文本元素
如果你看了第一篇的内容,你会发现我的代码是这样的: 文本 <span>文本</span> <scolia>文本</scolia> <scolia ...
- python去掉空行
#用strip(),split()两个方法都可以判断空行 infile=open('/.../','r') outfile=open('/.../','w') for li in infile.rea ...
- Python学习教程(learning Python)--2.2 Python下的变量基础
变量的基本概念,变量可以这样去理解,变量是一个值,这个值存储在计算机的内存里.以 网购为例,您在选购傻商品的时候,是在不同页面里选不同的商品,选好一件点击“放入购物车”,选完了再点击去结帐,这些商品的 ...
- WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)
无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...
- poj 2507Crossed ladders <计算几何>
链接:http://poj.org/problem?id=2507 题意:哪个直角三角形,一直角边重合, 斜边分别为 X, Y, 两斜边交点高为 C , 求重合的直角边长度~ 思路: 设两个三角形不重 ...
- [原创]pg_shard使用场景及功能测试
pg_shard是一个PostgreSQL的sharding extension.可以用于Shards.Replicates tables和高可用.它可以在不修改Applications的情况下无缝分 ...
- 基于Elasticsearch进行地理检索,计算距离值
实现步骤: 1.定义属性 [Serializable] public class Coordinate { public double Lat { get; ...