欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python入门习题(22)——CCF CSP认证考试真题:跳一跳

程序员文章站 2022-04-02 09:36:25
...

问题描述

试题编号: 201803-1
试题名称: 跳一跳
时间限制: 1.0s
内存限制: 256.0MB

问题描述
  近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。
  简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。
  如果跳到了方块上,但没有跳到方块的中心则获得1分;跳到方块中心时,若上一次的得分为1分或这是本局游戏的第一次跳跃则此次得分为2分,否则此次得分比上一次得分多两分(即连续跳到方块中心时,总得分将+2,+4,+6,+8…)。
  现在给出一个人跳一跳的全过程,请你求出他本局游戏的得分(按照题目描述的规则)。
输入格式
  输入包含多个数字,用空格分隔,每个数字都是1,2,0之一,1表示此次跳跃跳到了方块上但是没有跳到中心,2表示此次跳跃跳到了方块上并且跳到了方块中心,0表示此次跳跃没有跳到方块上(此时游戏结束)。
输出格式
  输出一个整数,为本局游戏的得分(在本题的规则下)。
样例输入
1 1 2 2 2 1 1 2 2 0
样例输出
22
数据规模和约定
  对于所有评测用例,输入的数字不超过30个,保证0正好出现一次且为最后一个数字。

解题思路

  1. 一次跳跃的得分由两个因素决定:一是本次跳到的位置(2表示跳到中心点,1表示跳上方块,但没跳到中心点,0表示没有跳到方块上);二是前一次跳跃的得分。
  2. 一次跳跃的得分的计算规则可以描述为:
    (1) 如果当前跳到的位置为1,则为1分。
    (2) 如果当前跳到的位置为2,则:
      如果前一次得分小于2,则为2分,否则得分 = 前一次得分+2
    (3) 如果当前跳到的位置为0,则得0分。
  3. 上述一次跳跃的得分计算规则可以用一个函数get_score来封装。函数的参数和返回值见下一节。
  4. 一组连续的跳跃的得分计算过程是: 从左到右累加每一次跳跃的得分。每一次跳跃的得分通过调用get_score(n, prev)得到。

参考答案

#求一次跳跃的得分的函数
#参数:本次跳跃的位置n(取1或2或0),前一次跳跃得分prev
#返回:本次跳跃得分
def get_score(n, prev):
    if n == 1:
        return 1
    elif n == 2:
        if prev < 2:
            return 2
        else:
            return prev + 2
    else:
        return 0

ns = [int(s) for s in input().split()]
prev = 0
sum = 0
for n in ns:
    prev = get_score(n, prev)
    sum += prev

print(sum)

测试用例

测试用例用来验证程序代码的正确性。问题描述中给出了一个常规的测试用例,下面补充的测试用例可以考察其他情形。

  1. 第一次跳到方块中心的情形。
    样例输入
    2 2 1 1 2 1 2 0
    样例输出
    13

  2. 每一次都跳到方块中心的情形。
    样例输入
    2 2 2 2 2 2 0
    样例输出
    42

  3. 每一次都得1分的情形。
    样例输入
    1 1 1 1 0
    样例输出
    4

小结

  1. 用函数来封装一次跳跃的得分的计算规则是好做法。这使得计算单次跳跃得分的过程和累加多次得分的计算过程分离开来。这样的分离使得代码更加简洁清晰,也减少了发生错误的几率。
  2. 解题思路一节给出的“一次跳跃的得分的计算规则”与题目描述中给出的计算规则有细微差异,但本质上是一致的。
    解题思路一节给出的计算规则更容易用代码实现,因为:
    (1) 无须考虑一次跳跃是否是第一次。prev=0时即为第一次。
    (2) 考虑到了跳到的位置为0的情形。这使得累加得分的计算过程无须针对尾部的0作出特殊的处理。