HDU-ACM“菜鸟先飞”冬训系列赛——第7场 H
Problem H
Problem Description
由于迷宫会在一段时间后关闭,所以小边必须在一定时间找到那块骨头,这样才能有充足的时间来带着骨头离开.
小边在迷宫中可以从当前位置走到相邻的位置,每次移动消耗单位时间,当然,因为小边对骨头的无比执着,它偶尔会使出绝技”狗急跳墙”(一次移动两个单位位置,同样消耗单位时间).使用这个技能的时候,可以翻过一面单位厚度的墙(即第一步移动可以踩在墙上,当然也可以不踩).
hint:使用技能的时候,不用管中间那一步是否可走。
那么小边能够如愿以偿的找到骨头并离开迷宫么?
Input
每组输入第一行是四个数m,n(0<m,n<=30),k(0<=k<=30),t(0<=t<=100),分别代表迷宫的长,宽,小边使用”狗急跳墙”的最大次数以及找到骨头的时间限制.
m=n=k=t=0代表输入结束
接下的m行每行有n个字符,‘.’代表地面,’#’代表墙,’@’代表目前小边所处的位置,’X’代表骨头所在的位置
Output
每个输出占一行.
Sample Input
3 3 1 2
@##
#.#
#X#
4 4 1 3
@.#.
#.##
####
##X.
0 0 0 0
Sample Output
Yes
No 这题把我搞死了。
其实直接大力搜就好了,唯一要注意的地方就是:当前走到的位置,如果剩下的使用技能的次数大于曾经走到这里的次数,那么更新。
当然,这里没走到过,也需要更新。
这样,更新次数就不超过30*30*30次(当然事实上远小于这个数量)
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i(0); i < (n); ++i)
#define rep(i,a,b) for(int i(a); i <= (b); ++i)
#define dec(i,a,b) for(int i(a); i >= (b); --i)
#define for_edge(i,x) for(int i = H[x]; i; i = X[i]) const int N = + ;
const int M = + ;
const int Q = + ;
const int A = + ; const int dx[] = {, , , -};
const int dy[] = {, , -, }; const int cx[] = {, , -, , , -, , -};
const int cy[] = {, , , -, , -, -, }; struct node{
int x, y, k, t;
} st, en; char s[Q];
int n, m, k, t;
int a[A][A];
queue <node> q;
int f[A][A]; bool check(int x, int y){
return (x >= ) && (x <= m) && (y >= ) && (y <= n);
} int main(){ while (~scanf("%d%d%d%d", &m, &n, &k, &t), n + m + k + t){
memset(a, , sizeof a);
rep(i, , m){
scanf("%s", s + );
rep(j, , n){
if (s[j] == '#'){
a[i][j] = ;
}
else{
a[i][j] = ;
if (s[j] == '@') st.x = i, st.y = j;
if (s[j] == 'X') en.x = i, en.y = j;
}
} }
while (!q.empty()) q.pop();
st.k = k;
st.t = t;
q.push(st);
memset(f, -, sizeof f);
f[st.x][st.y] = k;
int ans = ;
while (!q.empty()){
node now = q.front(); q.pop();
if (now.x == en.x && now.y == en.y && now.t >= ){
ans = ;
break;
}
REP(i, ){
node nn;
nn.x = now.x + dx[i];
nn.y = now.y + dy[i];
if (check(nn.x, nn.y) && f[nn.x][nn.y] < now.k && !a[nn.x][nn.y]){
nn.k = now.k;
nn.t = now.t - ;
if (nn.t >= ){
q.push(nn);
f[nn.x][nn.y] = nn.k;
}
}
}
if (now.k > ){
REP(i, ){
node nn;
nn.x = now.x + cx[i];
nn.y = now.y + cy[i];
if (check(nn.x, nn.y) && f[nn.x][nn.y] < now.k - && !a[nn.x][nn.y]){
nn.k = now.k - ;
nn.t = now.t - ;
if (nn.t >= ){
q.push(nn);
f[nn.x][nn.y] = nn.k;
}
}
}
}
}
if (ans) puts("Yes"); else puts("No");
}
return ; }
HDU-ACM“菜鸟先飞”冬训系列赛——第7场 H的更多相关文章
- HDU-ACM“菜鸟先飞”冬训系列赛——第10场
		
Problem A 题意 给出l(房子宽度),d(pole距离房子的垂直距离),s(绳子长度),求可覆盖的面积 分析 一共四种情况 \[1.s<=d\] \[2.s<=sqrt(d*d+l ...
 - HDU-ACM“菜鸟先飞”冬训系列赛——第9场
		
Problem A 题意 一对兔子每月生一对兔子,兔子在\(m\)月后成熟,问\(d\)月后有多少兔子 分析 可以发现,第i月的兔子数量取决于第i-1月与i-m月,故 \(a[i]=a[i-1]+a[ ...
 - HDU-ACM“菜鸟先飞”冬训系列赛——第8场(1004)
		
Problem D Time Limit : 3000/3000ms (Java/Other) Memory Limit : 65535/102400K (Java/Other) Problem De ...
 - HDU 4868 Information Extraction(2014 多校联合第一场 H)
		
看到这道题时我的内心是奔溃的,没有了解过HTML,只能靠窝的渣渣英语一点一点翻译啊TT. Information Extraction 题意:(纯手工翻译,有些用词可能在html中不是一样的,还多包涵 ...
 - hdu acm 1028  数字拆分Ignatius and the Princess III
		
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
 - Entity Framework菜鸟初飞
		
Entity Framework菜鸟初飞 http://blog.csdn.net/zezhi821/article/details/7235134
 - hdu 5418 (Floyd+哈密顿) 飞向世界
		
http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意是城市的编号是1到n,给出m条路线,表示从a城市飞到b城市飞机要耗多少油,最后问飞机从1出发飞过所 ...
 - hdu acm 1166 敌兵布阵 (线段树)
		
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
 - hdu acm 2082  找单词
		
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
 
随机推荐
- BFS:HDU3085-Nightmare Ⅱ(双向BFS)
			
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
 - 用 Tensorflow 建立 CNN
			
稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记. 还有 google 在 udacity 上的 CNN 教程. CNN(Convolutional Neural Networks) 卷积神经网络简单 ...
 - Redis的概述、优势和安装部署
			
Redis概述 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使 ...
 - icpc南昌邀请赛 比赛总结
			
上周末,我参加了icpc南昌区域赛邀请赛,这也是我的第一次外出参赛. 星期五晚上,在6个小时的火车和1个小时的公交后,我们终于抵达了江西师范大学,这次的比赛场地.江西师范大学周围的设施很齐全,各种烧烤 ...
 - redis命令monitor详解
			
通过monitor这个命令可以查看数据库在当前做了什么操作,对于管理redis数据库有这很大的帮助 如图示,在redis客户端进行操作显示info,另一个窗口打开monitor就会显示出这个命令的操作 ...
 - JavaWeb笔记(一)JDBC
			
基本步骤 导入MySQL驱动jar包 mysql-connector-java-8.0.15.zip 注册驱动 获取数据库连接对象Connection 定义sql 获取执行sql语句的对象Statem ...
 - sass和postcss
			
sass是css预处理器 需要安装node-sass支持 核心是c++编写 集成 sass-loader 把scss装换成css css-loader 找出@import和url()导入的语法,告诉w ...
 - MySQL Innodb表导致死锁日志情况分析与归纳
			
发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志 案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时 ...
 - C/C++注释规范
			
C/C++注释规范 Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持PHP.C#.鉴于Doxygen ...
 - APK包与类更改分析
			
360APK包与类更改分析 1 题目要求 这是360的全球招募无线攻防中的第二题,题目要求如下: 1)请以重打包的形式将qihootest2.apk的程序包名改为 "com.qihoo.cr ...