【青训营笔记创作活动】405 小M的弹子游戏机挑战

71 阅读2分钟

问题描述

小M最近迷上了一款弹子游戏机,规则如下:
玩家可以在版面最上方任意一个位置放置弹珠。弹珠会通过得分点时为玩家赢得分数,目标是获得尽可能高的分数。 小M最近迷上了一款弹子游戏机,规则如下:
玩家可以在版面最上方任意一个位置放置弹珠。弹珠会通过得分点时为玩家赢得分数,目标是获得尽可能高的分数。
弹子游戏机的版面由两种组成要素构成:

  1. 钉子(用 -1 表示),当弹珠碰到钉子时,有可能弹射到左下或者右下的位置。
  2. 得分点(非负整数),弹珠经过得分点时可以获得对应的分数。

如果弹珠所在的格子为空(即没有钉子或者得分点),弹珠会直接往下落。

小M想知道,在一个给定的版面布局中,他能够获得的最高分数是多少。

  • n 表示版面的高度。
  • m 表示版面的宽度。
  • array 是一个 n x m 的二维数组,其中:
  • -1 表示该位置为钉子;
  • 0 表示该位置为空;
  • 正整数表示该位置为得分点,值为该得分点的分数。

测试样例

样例1:

输入:n = 3 ,m = 3 ,array = [[-1, 0, -1], [100, 0, 0], [0, 50, 70]]
输出:50

样例2:

输入:n = 4 ,m = 3 ,array = [[-1, 0, -1], [0, -1, 0], [50, 100, 70], [80, 200, 50]]
输出:130

样例3:

输入:n = 5 ,m = 5 ,array = [[0, -1, 0, -1, 0], [0, 50, -1, 50, 0], [100, 0, 0, 0, 100], [0, 100, 0, 100, 0], [50, 0, 50, 0, 50]]
输出:150

问题解析

这是一道模拟问题,目标是在一个二维板面中,模拟弹珠的运动,计算不同初始位置下的最大得分。

规则回顾:

  1. 钉子-1):

    • 弹珠会被分流到左下或右下。如果弹珠到达边界且需要向外移动,则弹珠无法继续下落。
  2. 得分点(正整数):

    • 弹珠经过时获得分数。
  3. 空位0):

    • 弹珠直接下落。

思路解析

  1. 模拟弹珠运动

    • 从版面顶部的每个位置开始模拟弹珠下落。
    • 按规则处理碰到的钉子、得分点和空位,记录最终的得分。
  2. 遍历每个起始位置

    • 针对顶部的每个列位置,从当前列投放弹珠,模拟下落的过程,计算总得分。
    • 记录所有起始列位置中的最大得分。
  3. 规则实现

    • 遇到钉子时,尝试左右分流。
    • 遇到得分点时,累加得分。
    • 遇到边界无法继续下落时,结束当前弹珠的模拟。