问题描述
小M最近迷上了一款弹子游戏机,规则如下:
玩家可以在版面最上方任意一个位置放置弹珠。弹珠会通过得分点时为玩家赢得分数,目标是获得尽可能高的分数。
小M最近迷上了一款弹子游戏机,规则如下:
玩家可以在版面最上方任意一个位置放置弹珠。弹珠会通过得分点时为玩家赢得分数,目标是获得尽可能高的分数。
弹子游戏机的版面由两种组成要素构成:
- 钉子(用
-1表示),当弹珠碰到钉子时,有可能弹射到左下或者右下的位置。 - 得分点(非负整数),弹珠经过得分点时可以获得对应的分数。
如果弹珠所在的格子为空(即没有钉子或者得分点),弹珠会直接往下落。
小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):- 弹珠会被分流到左下或右下。如果弹珠到达边界且需要向外移动,则弹珠无法继续下落。
-
得分点(正整数):
- 弹珠经过时获得分数。
-
空位(
0):- 弹珠直接下落。
思路解析
-
模拟弹珠运动:
- 从版面顶部的每个位置开始模拟弹珠下落。
- 按规则处理碰到的钉子、得分点和空位,记录最终的得分。
-
遍历每个起始位置:
- 针对顶部的每个列位置,从当前列投放弹珠,模拟下落的过程,计算总得分。
- 记录所有起始列位置中的最大得分。
-
规则实现:
- 遇到钉子时,尝试左右分流。
- 遇到得分点时,累加得分。
- 遇到边界无法继续下落时,结束当前弹珠的模拟。