C++每日一练:隧道逃生(模拟游戏过程解法)


前言

今天的第一题也挺有意思,就拿它来练练。希望能经常看到这么有意思的练习题,少出神描述…
这题纯粹就是逻辑思维问题了,我没想到数学算法,就暴力模拟了一把,很快就解出来了。


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

题目描述:
小海豚喜欢打游戏,现在它在操纵游戏人物小C逃脱废弃的隧道,逃生装置在小C的前方 X 米远的位置。但是游戏机只有两个按钮:前进和后退,按前进,小C会前进 m 米,按后退,小C会后退 n 米。 小海豚必须设法把小C送到逃生装置上,方能逃离隧道,请你帮帮小海豚,告诉它至少要操作多少次,才能通关。

输入描述:
输入三个正整数X、m和n

输出描述:
输出一个整数,表示小海豚通关需要操作的次数

示例:
输入
5 77 157

输出
73

二、解题分析

我估计是有数学算法能解决这问题的,但咱小学数学没学好。
而且对计算机来说,加减法的运算速度是最快的!如果只用加减法,不会比数学公式一步算出来慢到哪去!因为加减法会比乘法运算快10倍,比除法快20倍。
最重要的是这题用模拟太容易写代码了,而且很优雅!

三、代码

代码如下(示例):

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

int solution(int X, int m, int n){
    int result=0;
    // TODO:
    int up=0, down=0;   //没操作按键时的初始值,前进0,后退0
    while (up-down!=X){
        if (up-down < X){
            up += m;    //当没到达出口时,按前进
            result++;
        }else{
            down += n;   //当超过出口时,按后退
            result++;
        } 
    }
    
    return result;
}

int main() {

    int X;
    int m;
    int n;
    std::cin>>X;
    std::cin>>m;
    std::cin>>n;

    int result = solution(X, m, n);

    std::cout<<result<<std::endl;

    return 0;
}

老是提示让我改进此文质量,又突然来了点灵感,我想到了一个稍微有点数学味的办法来解题了:
很明显设设置二个变量 i,j,i 代表前进的次数,j 代表后退的次数,那么设立一个条件:im - jn == 30,不足30加i,超过30加j,等于了就把i和j相加,就能解出来了,虽然逻辑没变,可这样不就很有点数学味了嘛…

总结

最重要的一点:题中的X是大写的!为这报了我几次没申明变量的错。
解题思路简单来说:就是没到出口时按一下前进键,还没到就再按前进,超过出口了就按后退,退多了又前进。这代码和玩游戏过程一模一样!我还是喜欢这个写法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无证的攻城狮

如本文对您有用,大爷给打个赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值