问题描述
正如标题中提到的,我试图找到网格中对角相邻数字的最大乘积,但不使用 numpy 库。
dataa = [
[1,2,3,4,5],[1,[2,5,6],[5,6,8,9,10],5]
]
def search_dr(data,length): # length = how many adjacent numbers to check
result,size = 0,len(data[0])
for i in range(size):
for y in range(0,len(data) - (length - 1)):
part,counter = [],0
while len(part) < length:
if size >= i + (length - 1): # for downward diagonal
part.append(data[y + counter][i + counter])
counter += 1
product = 1
for x in part:
product *= x
if product > result:
result = product
if length - 1 <= i: # for upward diagonal
part.append(data[y + counter][i - counter])
counter += 1
product = 1
for x in part:
product *= x
if product > result:
result = product
return result
search_dr(dataa,4)
预期输出为 480,因为它是 5 * 4 * 4 * 6 个相邻数字的结果,并且它们的乘积将是样本网格中其他 4 个相邻数字中最大的乘积。
但我不明白为什么它不起作用,并且在大多数情况下它会给出索引错误。 如果有人能帮助我理解我的代码问题,我将不胜感激。
主要样本:
[8,22,97,38,15,00,40,75,7,78,52,12,50,77,91,8],[49,49,99,17,81,18,57,60,87,98,43,69,48,56,62,00],[81,31,73,55,79,14,29,93,71,67,53,88,30,13,36,65],[52,70,95,23,11,42,24,68,1,32,37,91],[22,16,51,63,89,41,92,54,28,66,33,80],[24,47,45,44,84,20,35,50],[32,64,10,26,59,70],[67,94,39,21],58,96,83,34,72],[21,76,61,95],[78,80,92],[16,85,57],[86,21,58],[19,86,40],[4,27,66],[88,72,46,69],25,36],[20,82,74,16],90,54],19,48]
预期输出:70600674 [89,87]
解决方法
您应该采用更简单的方法,只处理属于 4 值对角线的位置。这可以通过识别包含左上角项的矩阵子集并从这些项下移 4 个位置来获得。
例如:
data = [
[1,2,3,4,5],[1,[2,5,6],[5,6,8,9,10],5]]
result = 0
values = []
diagLen = 4
for diagDir in (1,-1):
for r in range(len(data)-diagLen+1):
for c in range(len(data[0])-diagLen+1):
if diagDir<0 : c = len(data[0])-1-c
prod = 1
for i in range(diagLen): prod *= data[r+i][c+i*diagDir]
if prod<result: continue
result = prod
values = [data[r+i][c+i*diagDir] for i in range(diagLen)]
print(result,values)
# 480 [5,6]