跳格子游戏(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 号格子。
- 依次处理每次骰子点数:
- 计算跳跃后的目标位置(当前位置 + 骰子点数)。
- 若目标位置超过 n,则不跳跃,保持当前位置。
- 若未超过,则更新当前位置为目标位置。
- 处理完所有骰子点数后,输出最终位置。
三、代码实现步骤详解
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 号格子开始,因此
c
初始化为 1。 -
跳跃判断:
- 每次处理骰子点数前,先检查当前位置
c
是否已超过n
。若已超过,说明之前的跳跃已越界(根据规则,越界后不能再跳),此时最终位置应为上一次跳跃前的位置(即c - tiao[i-1]
,因为c
是上一次跳跃后的结果)。 - 若未超过
n
,则执行当前跳跃,位置更新为c + tiao[i]
。
- 每次处理骰子点数前,先检查当前位置
-
最终输出:
- 若中途因越界提前退出循环,输出上一次跳跃前的位置。
- 若所有
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
。