当前位置: 首页 > news >正文

跳格子游戏(1)

题目描述

# T432201 05-29-B01-跳格子游戏(1)(L2)

## 题目描述

有一排格子,共n个,序号为1~n,你可以想象成方格作业本的一行。初始时,玩家小A位于1号格子。接下来他投一次骰子,得到点数1~6,点数为几就往前跳几格。例如,第一次得到点数3,跳3格,就到了4号格子。已知m次投骰子得到的点数,问小A最终位于几号格子。注意,如果超出了n号格子,就不能往前跳了。

## 输入格式

输入数据第一行为两个正整数n和m,n≤100,m≤50。第二行有m个正整数,取值为1~6,表示m次投骰子得到的点数。

## 输出格式

输出占一行,为一个正整数,为小A的最终位置。

## 输入输出样例 #1

### 输入 #1

```
20 8
3 1 6 4 5 2 1 5
```

### 输出 #1

```
20
```

## 说明/提示

### 本题出处
本题源自以下教材的编程习题:王桂平, 周祖松, 穆云波, 葛昌威编著. C++趣味编程及算法入门. 北京大学出版社, 2024年出版.

一、题目分析

题目模拟一个跳格子游戏:有n个格子(序号 1~n),玩家从 1 号格子出发,根据m次骰子点数(1~6)向前跳格子。规则是:若跳跃后超出 n 号格子,则不执行该次跳跃。最终需输出玩家的位置。

二、核心思路

  1. 初始位置固定为 1 号格子。
  2. 依次处理每次骰子点数:
    • 计算跳跃后的目标位置(当前位置 + 骰子点数)。
    • 若目标位置超过 n,则不跳跃,保持当前位置。
    • 若未超过,则更新当前位置为目标位置。
  3. 处理完所有骰子点数后,输出最终位置。

三、代码实现步骤详解

1. 引入头文件与命名空间

cpp

运行

#include<bits/stdc++.h>  // 包含所有标准库
using namespace std;

2. 读取输入数据

cpp

运行

int n, m;  // n:格子总数;m:骰子次数
cin >> n >> m;vector<int> tiao;  // 存储m次骰子的点数
for (int i = 0; i < m; i++) {int input;cin >> input;  // 读取每次的点数tiao.push_back(input);  // 存入向量
}

3. 模拟跳跃过程

cpp

运行

int c = 1;  // 初始位置为1号格子for (int i = 0; i < m; i++) {  // 遍历m次骰子// 若当前位置已超过n,说明之前的跳跃已越界,后续跳跃均不执行if (c > n) {// 输出上一次跳跃前的位置(当前位置减去上一次的点数)cout << c - tiao[i-1] << endl;return 0;  // 程序结束}// 否则,执行当前跳跃(更新位置)c += tiao[i];
}// 若所有跳跃都未越界,输出最终位置
cout << c << endl;  // 原代码漏写此句,需补充

四、关键逻辑解析

  1. 初始位置:玩家从 1 号格子开始,因此c初始化为 1。

  2. 跳跃判断

    • 每次处理骰子点数前,先检查当前位置c是否已超过n。若已超过,说明之前的跳跃已越界(根据规则,越界后不能再跳),此时最终位置应为上一次跳跃前的位置(即c - tiao[i-1],因为c是上一次跳跃后的结果)。
    • 若未超过n,则执行当前跳跃,位置更新为c + tiao[i]
  3. 最终输出

    • 若中途因越界提前退出循环,输出上一次跳跃前的位置。
    • 若所有m次跳跃都未越界,循环结束后直接输出最终位置c(原代码漏写此句,实际需补充才能正确输出)。

五、示例测试解析

样例 1 输入:

plaintext

20 8
3 1 6 4 5 2 1 5

六、完整修正代码

cpp

运行

#include<bits/stdc++.h>
using namespace std;
int main(){int n, m;cin >> n >> m;vector<int> tiao;for (int i = 0; i < m; i++) {int input;cin >> input;tiao.push_back(input);}int c = 1;  // 初始位置for (int i = 0; i < m; i++) {int next = c + tiao[i];  // 计算目标位置if (next <= n) {  // 未超界则更新位置c = next;}// 超界则不更新,保持当前位置}cout << c << endl;  // 输出最终位置return 0;
}

该修正代码更直观地实现了题目规则,确保所有场景下的正确输出。

  • 初始位置c=1
  • 第 1 次点数 3:c = 1+3=4(≤20,正常跳跃)。
  • 第 2 次点数 1:c=4+1=5(≤20)。
  • 第 3 次点数 6:c=5+6=11(≤20)。
  • 第 4 次点数 4:c=11+4=15(≤20)。
  • 第 5 次点数 5:c=15+5=20(≤20)。
  • 第 6 次点数 2:c=20+2=22(>20)。
  • 第 7 次循环(i=6):检查到c=22>20,输出22 - tiao[5] = 22-2=20(正确)。
  • 其他测试场景:

  • 所有跳跃未越界:例如n=10,m=2,点数2和3。过程:c=1→3→6,循环结束后输出6

  • 首次跳跃即越界:例如n=3,m=1,点数3。过程:c=1+3=4>3,循环结束后(因 m=1,循环只执行 1 次,未触发中途退出),输出4?不,根据规则,越界时不跳跃,正确结果应为 1。这里原代码逻辑有缺陷,需修正为:每次先计算目标位置,若超界则不更新。

    修正逻辑示例:

    cpp

    运行

    for (int i=0; i<m; i++) {int next = c + tiao[i];if (next <= n) {c = next;}
    }
    cout << c << endl;
    

    这种逻辑更直接:计算目标位置,不超界才更新,最终输出c

http://www.dtcms.com/a/504011.html

相关文章:

  • 谈谈你对Mysql 锁的理解
  • 网站开发有哪些模块想做分销商有什么平台
  • P14245 [CCPC 2024 Shandong I] 左移题解
  • 网站做支付宝花呗分期有哪些做家教网站
  • Altium Designer(AD24)Tools工具功能总结
  • 做分析图的地图网站自己做网站网页剧中
  • 产妇入院出院过程分享
  • Windows 安装 WSL2 全指南(2025 版)
  • StarsNote 1.0.9
  • 通信原理(007)——FFT脚本(超级实用简单)
  • 新国际网站建设wordpress对接微信
  • 广州外贸营销型网站thinkphp 网站源码
  • 电影天堂网页入口 - 免费高清电影在线观看
  • 停止线程:官方版本
  • 最好的响应式网站电子外贸网站建设
  • 有效市场假说
  • 网站图片用什么软件做网站框架
  • 农业服务网站建设方案免费的资料网站
  • 4-SpringCloud-Resilience4J服务熔断与降级
  • 网站可以叫做系统吗建站广告
  • 网站搭建说明哪家公司的网好
  • Java基础语法—分支结构
  • 郑州网站制作设计营销行网站建设
  • LeetCode 1170.比较字符串最小字母出现频次
  • 自己做的网站如何管理平台公司的定义
  • 北京网站维护浩森宇特福州网站建设案例
  • FFmpeg 基本API avcodec_open2函数内部调用流程分析
  • a5站长网平面广告怎么设计
  • cnzz网站建设桐乡市建设局官方网站
  • 关于网站建设 策划文案大连市建设工程老网站