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 ...
随机推荐
- Debug调试文件
在debug.h中设置g_debug_switch即可控制调试级别. /* debug.c */ #include "debug.h" const char *get_log_le ...
- 教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
摘录 文章主要是介绍了通过一个第三方类库RazorJS,实现Javascript 文件里使用 .Net MVC Razor 语法,很巧妙,推荐给大家 相信大家都试过在一个 View 里嵌套使用 jav ...
- xcode6没有prefix.pch预编译文件解决办法
注意到Xcode6创建的工程没有prefix.pch. 于是手动创建. 在other下选择pch文件 接着到工程的build setting下设置开启预编译并配置路径(文件的路径.因为我新建在cofi ...
- Careercup - Microsoft面试题 - 24308662
2014-05-12 07:31 题目链接 原题: I have heard this question many times in microsoft interviews. Given two a ...
- leetcode 【 Linked List Cycle II 】 python 实现
公司和学校事情比较多,隔了好几天没刷题,今天继续刷起来. 题目: Given a linked list, return the node where the cycle begins. If the ...
- Android ListView用法
写了一个简单的示例来说明ListView的用法:给定一个单词,下面有四个含义,找出正确的一个,无论是否成功,则会跳转到下一个单词:主要用到的知识有: findViewById(). ListView ...
- Python+Selenium练习篇之16-自定义浏览器窗口大小
本文来学习下如何通过Selenium方法,设置符合不同测试场景浏览器窗口大小.例如,你有一台机器,最大支持1366*768,你完全可以利用这个机器测试不同分辨率下的场景. 相关测试脚本代码如下: # ...
- c++ 运算符重载operator
一般格式为: 函数类型 operator 运算符名称(形参列表){ 对运算符的重载 } 注意函数名是由operator和运算符组成.在上面的一般格式中,operator是关键字,是专门用于重载运算符函 ...
- DNS(转载)
最近帮朋友注册域名配置主机,碰到一些DNS上的一些概念,惭愧于有一些东西已经忘记是啥意思,于是决定重新学习一下DNS方面的基本概念. 常用概念: TTL: TTL为Time to live的缩写,网络 ...
- 【转】Twitter-Snowflake,64位自增ID算法详解
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...