小M的弹子游戏机挑战 | 豆包MarsCode AI刷题

65 阅读2分钟

问题描述: 小M在玩一款弹子游戏机,目标是在给定版面布局中获得最高分数。版面由钉子(-1,会改变弹珠方向)和得分点(非负整数,弹珠经过时得分)组成,空位置(0)则让弹珠直接下落。版面高度为n,宽度为m,以n x m二维数组表示。小M想知道在任意上方位置放置弹珠,能获得的最高分数是多少。

代码实现:

def solution(n, m, array):
    # Edit your code here
    a=[[]]
    def recursive(row,col):
        if(row==n-1):
            if(array[row][col]==-1):
                return 0
            else:
                return array[row][col]
        elif(array[row][col]>=0):
            print(row,col)
            return array[row][col]+recursive(row+1,col)
        elif(array[row][col]==-1):
            if(col==0):
                return recursive(row+1,col+1)
            elif(col==m-1):
                print(row,col)
                return recursive(row+1,col-1)
            else:
                print(row,col)
                return max(recursive(row+1,col+1),recursive(row+1,col-1))
    result=0
    for i in range(m):
        temp=recursive(0,i)
        if(result<temp):
            result=temp
    print(result)
    return result

代码思路:

  1. 定义一个递归函数 recursive(row, col),该函数用于计算从当前行 row 和列 col 开始,能够获得的最高分数。
  2. 在递归函数中,首先检查是否到达了版面的底部(即 row == n-1),如果是,则根据当前格子的内容返回相应的分数或者0。
  3. 如果当前格子是得分点(即 array[row][col] >= 0),则将该得分点分数加上从下一行同一列继续递归得到的分数。
  4. 如果当前格子是钉子(即 array[row][col] == -1),则需要根据弹珠的弹射规则,递归计算弹珠弹射到左下和右下位置能够获得的最高分数,并返回两者的最大值。
  5. 如果当前格子为空(即 array[row][col] == 0),则弹珠直接下落,继续递归计算下一行的同一列。
  6. 在主函数 solution 中,遍历版面最上方的每一列,调用递归函数 recursive 计算从该列开始能够获得的最高分数,并更新结果 result
  7. 最后,返回 result 作为能够获得的最高分数。

代码的改进和优化: 我们可以使用记忆化搜索来优化。具体方法是,新建一个二维数组m,存储每个位置已经计算过的分数。在需要某位置的分数时,直接从数组m中查找。如果查找不到、再调用递归进行计算、计算过后存储到数组m中。使用这种方法可以避免重复计算,提高算法的效率。这种方法称为记忆化搜索。