跳格子游戏(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值