题目描述
# 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。
962

被折叠的 条评论
为什么被折叠?



