文档章节

洞穴逃生

山大软件陈大伟
 山大软件陈大伟
发布于 2014/09/06 18:08
字数 1482
阅读 11
收藏 0

这道题有很多程序员像数学家一样从时间或者距离去讨论。

事实上这样做很麻烦。

笔者提出一种新的思路。

建立一个王子类。

王子具有属性M,S,T。

调用fly()方法使得M-10,S+60,T-1.

调用run()方法使得S+17,T-1.

调用renew()方法使得M+4,T-1.

而王子只需要考虑下一秒该做什么

1.毋庸置疑,run()是不能安排在fly()之前的。

2.王子会优先进行fly操作,但王子有可能耗尽魔法。

3.王子在不能 fly的时候,只需要考虑要renew还是要run。

4.只有在跑步逃离洞穴的时间小于回满魔法并闪烁逃离的时间才选择run

//第四步跳跃有点大,请读者细细体会,并且在实时跟踪MST的情况下这个条件是可以判断的

5.若第4部判定当前不应该run,那么就等待魔法恢复至10并闪烁。

6.闪烁完毕魔法又不足了,回到第四步进行循环。

 

注意:在这个过程中若T减小到了0,那么返回No S。

           若S增加到了逃离洞穴的S,那么返回Yes T。

 

下面附代码,我知道你是做华为的应聘考试练习题搜到的这篇博客。这个代码保证完全正确。

但是我没把它整理好,你看起来会很吃力,所以你不妨自己去写一份,写到不明白的地方再来参考。

 

 #include "stdafx.h"
#include <iostream>
using namespace std;
bool ifcanrun(int M,int S)
//该算法用来计算 等待回复魔法值并飞行的时间能否跑出去。
{   int t;
     M=10-M;  //替换概念,M变成10-M。
     t= M%4;
  if(!t==0)
  //把(4-余数)加到M上,且余数为0时不要加。确保回复魔法的单位为秒。
  M=M+(4-t);
     int tw;
     tw=M/4;    //tw为回复至10点魔法至少需要的时间
  tw=tw+1;//飞行还要一秒钟
bool run=false; 
if(tw*17>=S)
{run=true;
}     
return run;
}
 
int Tneed(int M,int S)
//该方法用来计算飞出洞穴所需要的时间
{   int T=0;
 while(S>17&&M>=10)//当剩余距离大于17且魔法值大于10时,一定要飞。
 {
  T=T+1;//飞一秒
  M=M-10;//扣10点魔法
  S=S-60;//闪烁60m
 
 }
//跳出循环时M不足10 或者S<=17;
 if(S<=0)
 {return T;//已经出来啦
 }
   if(S<=17)
   {
   T =T+1;//跑一秒
   return T;//已经出去
   }
//此时M 不足10 ,需要判断是否需要等待并飞
  while(S>17)
  {
   if(ifcanrun(M,S))//此时要跑出去
   {
    if(S%17==0)
          {
    T=T+S/17;  
    return T;
    }
          else
    {
    T =T +S/17+1;//不能整除多花1秒
    return T;
    } 
   }
     //不能跑出去,那就等待回复并闪烁
       while(M<10)
    {T=T+1;
    M =M +4;
    }
     //跳出循环,魔法已足,发动闪烁
     T=T+1;//飞一秒
  M=M-10;//扣10点魔法
  S=S-60;//闪烁60m
   //闪烁完毕要查看当前距离是否小于等于17,所以继续循环。
  }
  //此时S一定小于17了,洞口就在眼前!
 if(S<=0)
 {return T;//已经出来啦,还跑什么跑
 }
   if(S<=17)
   {
   T =T+1;//跑一秒
   return T;//已经出去
   }
}
int Sleft(int M,int S,int tleft)
//该方法用来计算飞出洞穴所需要的时间
{   int T=0;
 while(S>17&&M>=10)//当剩余距离大于17且魔法值大于10时,一定要飞。
 {
  T=T+1;//飞一秒
  M=M-10;//扣10点魔法
  S=S-60;//闪烁60m
    if (T>=tleft)
    {
     return S;
    }
 
 }
//跳出循环时M不足10 或者S<=17;
 if(S<=0)
 {return T;//已经出来啦
 }
   if(S<=17)
   {
   T =T+1;//跑一秒
   return T;//已经出去
   }
//此时M 不足10 ,需要判断是否需要等待并飞
  while(S>17)
  {
   if(ifcanrun(M,S))//此时要跑出去
   {
    if(S%17==0)
          {
    T=T+S/17;  
        if (T>=tleft)
    {   
  T=T-S/17;
  T=tleft-T;
       S=S-T*17;
     return S;
    }
    }
          else
    {
    T =T +S/17+1;//不能整除多花1秒
        if (T>=tleft)
    {   
  T=T-S/17-1;
  T=tleft-T;
       S=S-T*17;
     return S;
    }
    } 
   }
     //不能跑出去,那就等待回复并闪烁
   int MM=0;
       while(M<10)
    {
     T=T+1;
        M =M +4;
           MM=MM+1;
    if (T>=tleft)
    {   S=S-MM*17;
       return S;
    }
 
    }
     //跳出循环,魔法已足,发动闪烁
MM=0;//回魔计数器清零
     T=T+1;//飞一秒
  M=M-10;//扣10点魔法
  S=S-60;//闪烁60m
    if (T>=tleft)
    {  
 
     return S;
    }
 
   //闪烁完毕要查看当前距离是否小于等于17,所以继续循环。
  }
  //此时S一定小于17了,洞口就在眼前!
 if(S<=0)
 {return T;//已经出来啦,还跑什么跑
 }
   if(S<=17)
   {
   T =T+1;//跑一秒
   return T;//已经出去
   }
}
 
bool yesno(int Tneed, int T)
{
if (Tneed<=T)
{return true;
}
return false;
}
 
 
  int main(){
  int M,S,T;
 
  while (cin>>M>>S>>T)
  {
                   if (yesno(Tneed(M,S),T))
       { cout<<   "YES "     <<Tneed(M,S)   <<endl;}
       else{ cout<<   "NO "  <<S-Sleft(M,S,T)     <<endl;}
        
    
     }
  
  
  }

 

 

 

 

 

© 著作权归作者所有

山大软件陈大伟
粉丝 0
博文 1
码字总数 1482
作品 0
济南
私信 提问
用java把这道华为2014机试试题 - 洞穴逃生,做出来,看看谁写的代码更好?

/************************************************************************ 洞穴逃生 描述: 精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵 王子不小心触...

天池番薯
2014/08/22
1K
4
清华大学保研笔试题目及解答

版权声明:本文为博主原创文章,未经博主允许不得转载。博客不用于商业活动,博主对博客的使用,拥有最终解释权 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用...

hit2015spring
2017/05/10
0
0
用VR学习灾难逃生技巧,地震来了不再慌

地震不是最可怕的,更可怕的是没有基本的逃生技能。 在中国,四川、新疆等地区属于地震频发区,但关于地震逃生技能的培训却很匮乏。仅仅是进行学校、公司的灾前疏散演习并不够,程序员给出了...

行者武松
2018/03/02
0
0
Packetfence 开源网络准入系统

Packetfence 网络准入系统: 开源的准入系统,我公司现在有6-7百人吧,正在用。版本是5.7。现在最新的都出到6.多了 主要用户体验是:用户电脑接入网络,网页任何打开一个网页会自动跳转到一个...

eq2008
2018/06/26
0
0
巨洞冒险:史上最有名的经典文字冒险游戏

巨洞冒险Colossal Cave Adventure,又名 ADVENT、Clossal Cave 或 Adventure,是八十年代初到九十年代末最受欢迎的基于文字的冒险游戏。这款游戏还作为史上第一款“互动小说interactive fic...

作者: Sk
2018/01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
53分钟前
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
8
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
11
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
10
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部