游戏开发:二维数组中机器人位置十字形区域元素求和
解决机器人十字形区域宝藏求和问题
我来帮你搞定这个机器人在地图上计算十字区域宝藏总和的需求!先把需求拆解清楚:我们需要计算机器人当前位置所在的十字形区域的所有宝藏数值之和,这个十字形是指:
- 同一行中,从当前位置往左最多4个位置、往右最多4个位置(包含当前位置)
- 同一列中,从当前位置往上最多4个位置、往下最多4个位置(不包含当前位置,避免重复计算)
而且所有位置都不能超出地图数组的边界。
先拿你的示例验证一下逻辑:
当机器人在a[0][0](数值1)时:
- 同一行的有效列范围是0到3(因为往右最多4个,但数组只有4列,索引0-3),对应元素1、2、3、4
- 同一列的有效行范围是1到3(往上没有位置,往下最多4个,数组有4行,索引0-3,排除当前行0),对应元素5、9、13
- 总和就是1+2+3+4+5+9+13=37,和你给出的结果一致。
当机器人在a[1][2](数值7)时:
- 同一行的有效列范围是0到3,对应元素5、6、7、8
- 同一列的有效行范围是0、2、3(排除当前行1),对应元素3、11、15
- 总和是5+6+7+8+3+11+15=55。
下面是用Python实现的通用解决方案,代码简洁且处理了所有边界情况:
def calculate_cross_treasure_sum(grid, current_row, current_col): rows = len(grid) if rows == 0: return 0 cols = len(grid[0]) # 计算当前行的宝藏和:左右各最多4个,不越界 start_col = max(0, current_col - 4) end_col = min(cols - 1, current_col + 4) row_total = sum(grid[current_row][col] for col in range(start_col, end_col + 1)) # 计算当前列的宝藏和:上下各最多4个,排除当前行避免重复 start_row = max(0, current_row - 4) end_row = min(rows - 1, current_row + 4) col_total = sum(grid[row][current_col] for row in range(start_row, end_row + 1) if row != current_row) return row_total + col_total # 测试你的示例地图 test_grid = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] # 测试角落位置 print(calculate_cross_treasure_sum(test_grid, 0, 0)) # 输出37 # 测试中间位置 print(calculate_cross_treasure_sum(test_grid, 1, 2)) # 输出55
代码关键点说明:
- 边界处理:用
max(0, ...)和min(数组最大索引, ...)确保不会访问超出数组范围的位置,避免索引错误。 - 避免重复计算:计算列总和时跳过当前行,因为当前位置已经在计算行总和时加过了。
- 通用性:不管地图是多大的二维数组(只要是矩形),这个函数都能正常工作,不需要修改核心逻辑。
内容的提问来源于stack exchange,提问作者John Lexus
相关产品推荐
相关产品推荐

