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 ...
随机推荐
- [NOIP2012]疫情控制(二分答案+倍增+贪心)
Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...
- 3 ways of including JavaScript in HTML
Code written in JavaScript must be executed from a document written in HTML. There are three ways of ...
- C#+VisionPro连接相机获取图像的两种方式
两种比较常用的方式. C#直接连接相机获取图像(GIGE) 在获取图像前,需要先创建一个相机对象,再使用这个相机对象的Acquire方法拍摄照片. ICogAcqFifo macqfifo;//定义相 ...
- day10 消息队列,多进程和多线程以及协程,异步IO,事件驱动等
回顾一下线程和进程 线程与进程的区别 守护线程: 队列: 两种方式: 先进先出 # 后入先出 #卖水果,后来的来的是新的 生产者消费者模型: 生产包子, 吃包子 事件 event: 红绿灯模型 ...
- cf979d Kuro and GCD and XOR and SUM
set做法 正解是trie-- 主要是要学会 \(a\ \mathrm{xor}\ b \leq a+b\) 这种操作 #include <iostream> #include <c ...
- IOS开发学习笔记011-xcode使用技巧
xcode使用技巧 1.自动生成类 2.断点调试 3.代码段保存 4.注释标记 1.新建类,自动生成两个文件和基本结构 第一步 第二步,选择新建一个类,而不是一个源文件 第三步,书写类名一级自己要 ...
- IOS开发学习笔记010-面向对象的三大特性
面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...
- php 实现栈与队列
<?php class queueOp{ /* * 队尾入队 * Return:处理之后队列的元素个数 */ public function tailEnquque($arr,$val){ re ...
- ubuntu16.04中docker安装curl拒绝连接问题
在Ubuntu16.04中安装docker ce,安装步骤按照官网说明https://docs.docker.com/engine/installation/linux/docker-ce/ubunt ...
- 实用拜占庭容错算法PBFT
实用拜占庭容错算法PBFT 实用拜占庭容错算法PBFT 96 乔延宏 2017.06.19 22:58* 字数 1699 阅读 4972评论 0喜欢 11 分布式架构遭遇的问题 分布式架构会遭遇到以下 ...