【发布时间】:2018-09-07 22:30:12
【问题描述】:
我正在创建一个机器人穿越二维数组地图的游戏。二维数组中的每个点都有一个“宝藏”,即许多硬币。我希望能够从机器人当前位置向上、向下、向右和向左添加最多 4 个位置的所有元素(制作一个“加号”符号)。所以,如果我们有一个数组:
a = [[1, 2, 3, 4]
[5, 6, 7 ,8]
[9, 10, 11, 12]
[13, 14, 15, 16]
如果机器人站在a[0][0](在 1 位置),则总和将返回 1+2+3+4+5+9+13。如果他站在a[1][2](第 7 位)上,它将返回(7+3)+(8)+(5+6)+(11+15)。但我希望它最多只能返回 4 个位置。最后,我想为机器人找到最佳位置。
这是我的代码:
def the_place_to_be(a):
maximum = 0
for i in range(len(a)):
# Looping through columns
for j in range(len(a[i])):
# Looping through rows
sum_at_ij = a[i][j]
for x in range(i - max_steps_in_direction(a, i, "up"), i):
sum_at_ij += a[x][j]
for x in range(j - max_steps_in_direction(a[i], j, "left"), j):
sum_at_ij += a[i][x]
for x in range(i, i + max_steps_in_direction(a, i, "down")):
sum_at_ij += a[x+1][j]
for x in range(j, j + max_steps_in_direction(a[i], j, "right")):
sum_at_ij += a[i][x+1]
if sum_at_ij >= maximum:
maximum = sum_at_ij
coordinates = "(" + str(i) + ", " + str(j) + ")"
return maximum, coordinates
def max_steps_in_direction(a, idx, direction):
if direction == "up" or direction == "left":
return min(idx, 4)
elif direction == "down" or direction == "right":
return min(len(a) - idx - 1, 4)
这可能是最糟糕的时间复杂度。我正在查看整个数组,然后循环遍历所有元素,直到距离机器人所在坐标的四个位置,在顶部、底部、右侧和左侧方向。
在每一步中,我计算的值都超出了我的要求。有没有办法减轻这种情况?我在想也许我的变量sum_at_ij 可以保存。我基本上是在多列表中的每个列表中移动。在列表中的每一点,我实际上只计算 一些 与前一个坐标不同的值。因此,再次假设我在坐标 a[2][2] 或坐标 11,当我移动到 a[2][3] 或坐标 12 时,差异在于:
sum_at_22:11 + 7 + 3 + 15 + 12 + 10 + 9
sum_at_23:12 + 8 + 4 + 16 + 11 + 10 + 9
我正在计算总共 3 个新值(顶部和底部的值不同)。如果这是一个 8x8 矩阵,则新值将是顶部值、底部值以及右侧的一个新值和左侧的少一个值。如果我保存了每个值(可能在某个哈希图中),那么也许我可以找到一些公式。说实话,我不知道。也许这是一个 math.stackexchange 问题。
有什么想法可以节省计算时间(是的,没关系)以内存为代价?
【问题讨论】:
-
如何将字段设为 numpy 数组并使用切片及其 sum 函数?
-
@jotasi 似乎是一个很好的答案,需要澄清:)
-
如果我猜对了,那么 a[1][2](第 7 点),它会是 7+3+6+5+8+11+15 但你说的是 a[1][ 2](第 7 点),它会返回 (7+1)+(8)+(5+6)+(11+15) ?
-
@AyodhyankitPaul 不错!你完全正确
-
@JohnLexus 数组大小将相同,或者它可以大小(任意大小)?
标签: python algorithm multidimensional-array